diff --git a/src/core/coap/coap_server.cpp b/src/core/coap/coap_server.cpp index d6a52e570..3e80530fc 100644 --- a/src/core/coap/coap_server.cpp +++ b/src/core/coap/coap_server.cpp @@ -105,6 +105,30 @@ ThreadError Server::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMess return mSender(this, aMessage, aMessageInfo); } +ThreadError Server::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) +{ + ThreadError error = kThreadError_None; + Coap::Header responseHeader; + Message *message = NULL; + + VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, error = kThreadError_InvalidArgs); + + responseHeader.SetDefaultResponseHeader(aRequestHeader); + + VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs); + + SuccessOrExit(error = SendMessage(*message, aMessageInfo)); + +exit: + + if (error != kThreadError_None && message != NULL) + { + message->Free(); + } + + return error; +} + void Server::ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { Header header; diff --git a/src/core/coap/coap_server.hpp b/src/core/coap/coap_server.hpp index d372e75b6..acf7c2191 100644 --- a/src/core/coap/coap_server.hpp +++ b/src/core/coap/coap_server.hpp @@ -178,6 +178,19 @@ public: */ ThreadError SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + /** + * This method sends a CoAP ACK message on which a dummy CoAP response is piggybacked. + * + * @param[in] aRequestHeader A reference to the CoAP Header that was used in CoAP request. + * @param[in] aMessageInfo The message info corresponding to the CoAP request. + * + * @retval kThreadError_None Successfully enqueued the CoAP response message. + * @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response. + * @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type. + * + */ + ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo); + /** * This method sets CoAP server's port number. * diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 4ef7a7d9e..3bdb3ce7c 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -758,37 +758,14 @@ void Commissioner::HandleDatasetChanged(Coap::Header &aHeader, Message &aMessage otLogInfoMeshCoP("received dataset changed"); (void)aMessage; - SendDatasetChangedResponse(aHeader, aMessageInfo); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo)); + + otLogInfoMeshCoP("sent dataset changed acknowledgment"); exit: otLogFuncExit(); } -void Commissioner::SendDatasetChangedResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) -{ - ThreadError error = kThreadError_None; - Coap::Header responseHeader; - Message *message; - - otLogFuncEntry(); - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); - - otLogInfoMeshCoP("Sent dataset changed acknowledgment"); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - otLogFuncExit(); -} - void Commissioner::HandleJoinerFinalize(void *aContext, otCoapHeader *aHeader, otMessage aMessage, const otMessageInfo *aMessageInfo) { diff --git a/src/core/meshcop/commissioner.hpp b/src/core/meshcop/commissioner.hpp index 490660fea..8b08a41ea 100644 --- a/src/core/meshcop/commissioner.hpp +++ b/src/core/meshcop/commissioner.hpp @@ -224,7 +224,6 @@ private: static ThreadError SendRelayTransmit(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); ThreadError SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - void SendDatasetChangedResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo); ThreadError SendCommissionerSet(void); ThreadError SendPetition(void); ThreadError SendKeepAlive(void); diff --git a/src/core/meshcop/energy_scan_client.cpp b/src/core/meshcop/energy_scan_client.cpp index 1962cedf7..bebe26219 100644 --- a/src/core/meshcop/energy_scan_client.cpp +++ b/src/core/meshcop/energy_scan_client.cpp @@ -133,6 +133,7 @@ void EnergyScanClient::HandleReport(void *aContext, otCoapHeader *aHeader, otMes void EnergyScanClient::HandleReport(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { MeshCoP::ChannelMask0Tlv channelMask; + Ip6::MessageInfo responseInfo(aMessageInfo); OT_TOOL_PACKED_BEGIN struct @@ -157,36 +158,13 @@ void EnergyScanClient::HandleReport(Coap::Header &aHeader, Message &aMessage, co mCallback(channelMask.GetMask(), energyList.list, energyList.tlv.GetLength(), mContext); } - SendResponse(aHeader, aMessageInfo); + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo)); + + otLogInfoMeshCoP("sent energy scan report response"); exit: return; } -ThreadError EnergyScanClient::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error = kThreadError_None; - Message *message; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; -} - } // namespace Thread diff --git a/src/core/meshcop/energy_scan_client.hpp b/src/core/meshcop/energy_scan_client.hpp index 1cf1c1b9a..7049962e4 100644 --- a/src/core/meshcop/energy_scan_client.hpp +++ b/src/core/meshcop/energy_scan_client.hpp @@ -82,8 +82,6 @@ private: const otMessageInfo *aMessageInfo); void HandleReport(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo); - otCommissionerEnergyReportCallback mCallback; void *mContext; diff --git a/src/core/meshcop/panid_query_client.cpp b/src/core/meshcop/panid_query_client.cpp index 75a2f7e87..53c212954 100644 --- a/src/core/meshcop/panid_query_client.cpp +++ b/src/core/meshcop/panid_query_client.cpp @@ -119,6 +119,7 @@ void PanIdQueryClient::HandleConflict(Coap::Header &aHeader, Message &aMessage, { MeshCoP::PanIdTlv panId; MeshCoP::ChannelMask0Tlv channelMask; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable && aHeader.GetCode() == kCoapRequestPost, ;); @@ -136,37 +137,13 @@ void PanIdQueryClient::HandleConflict(Coap::Header &aHeader, Message &aMessage, mCallback(panId.GetPanId(), channelMask.GetMask(), mContext); } - SendConflictResponse(aHeader, aMessageInfo); + memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo)); + + otLogInfoMeshCoP("sent panid query conflict response"); exit: return; } -ThreadError PanIdQueryClient::SendConflictResponse(const Coap::Header &aRequestHeader, - const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error = kThreadError_None; - Message *message; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; -} - } // namespace Thread diff --git a/src/core/meshcop/panid_query_client.hpp b/src/core/meshcop/panid_query_client.hpp index 1423e4269..7050b7e75 100644 --- a/src/core/meshcop/panid_query_client.hpp +++ b/src/core/meshcop/panid_query_client.hpp @@ -80,8 +80,6 @@ private: const otMessageInfo *aMessageInfo); void HandleConflict(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - ThreadError SendConflictResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo); - otCommissionerPanIdConflictCallback mCallback; void *mContext; diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index 131a7591e..bc4194b52 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -281,7 +281,12 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message & mCache[i].mTimeout = 0; mCache[i].mFailures = 0; mCache[i].mState = Cache::kStateCached; - SendAddressNotificationResponse(aHeader, aMessageInfo); + + if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None) + { + otLogInfoArp("Sent address notification acknowledgment"); + } + mMeshForwarder.HandleResolved(*targetTlv.GetTarget(), kThreadError_None); break; } @@ -291,32 +296,6 @@ exit: return; } -void AddressResolver::SendAddressNotificationResponse(const Coap::Header &aRequestHeader, - const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error; - Message *message; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); - - otLogInfoArp("Sent address notification acknowledgment"); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } -} - ThreadError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid, const Ip6::Address *aDestination) { @@ -363,32 +342,6 @@ exit: return error; } -void AddressResolver::SendAddressErrorResponse(const Coap::Header &aRequestHeader, - const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error; - Message *message; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); - - otLogInfoArp("Sent address error notification acknowledgment"); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } -} - void AddressResolver::HandleAddressError(void *aContext, otCoapHeader *aHeader, otMessage aMessage, const otMessageInfo *aMessageInfo) { @@ -415,7 +368,10 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag if (!aMessageInfo.GetSockAddr().IsMulticast()) { - SendAddressErrorResponse(aHeader, aMessageInfo); + if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None) + { + otLogInfoArp("Sent address error notification acknowledgment"); + } } SuccessOrExit(error = ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv)); diff --git a/src/core/thread/address_resolver_ftd.hpp b/src/core/thread/address_resolver_ftd.hpp index ee6b9cfab..1c88db7f3 100644 --- a/src/core/thread/address_resolver_ftd.hpp +++ b/src/core/thread/address_resolver_ftd.hpp @@ -154,8 +154,6 @@ private: void SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv, const ThreadMeshLocalEidTlv &aMlEidTlv, const ThreadLastTransactionTimeTlv *aLastTransactionTimeTlv, const Ip6::Address &aDestination); - void SendAddressErrorResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo); - void SendAddressNotificationResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo); static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo); diff --git a/src/core/thread/announce_begin_server.cpp b/src/core/thread/announce_begin_server.cpp index 2005fa1ed..df4548ec9 100644 --- a/src/core/thread/announce_begin_server.cpp +++ b/src/core/thread/announce_begin_server.cpp @@ -104,6 +104,7 @@ void AnnounceBeginServer::HandleRequest(Coap::Header &aHeader, Message &aMessage MeshCoP::ChannelMask0Tlv channelMask; MeshCoP::CountTlv count; MeshCoP::PeriodTlv period; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;); @@ -118,40 +119,13 @@ void AnnounceBeginServer::HandleRequest(Coap::Header &aHeader, Message &aMessage SendAnnounce(channelMask.GetMask(), count.GetCount(), period.GetPeriod()); - SendResponse(aHeader, aMessageInfo); - -exit: - return; -} - -ThreadError AnnounceBeginServer::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error = kThreadError_None; - Message *message = NULL; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo)); otLogInfoMeshCoP("sent announce begin response"); exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; + return; } void AnnounceBeginServer::HandleTimer(void *aContext) diff --git a/src/core/thread/announce_begin_server.hpp b/src/core/thread/announce_begin_server.hpp index 9b30cc78a..667890c5f 100644 --- a/src/core/thread/announce_begin_server.hpp +++ b/src/core/thread/announce_begin_server.hpp @@ -91,8 +91,6 @@ private: const otMessageInfo *aMessageInfo); void HandleRequest(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo); - static void HandleTimer(void *aContext); void HandleTimer(void); diff --git a/src/core/thread/energy_scan_server.cpp b/src/core/thread/energy_scan_server.cpp index 9504bca11..280fdd6c8 100644 --- a/src/core/thread/energy_scan_server.cpp +++ b/src/core/thread/energy_scan_server.cpp @@ -79,6 +79,7 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c MeshCoP::PeriodTlv period; MeshCoP::ScanDurationTlv scanDuration; MeshCoP::ChannelMask0Tlv channelMask; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;); @@ -92,7 +93,7 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c VerifyOrExit(scanDuration.IsValid(), ;); SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kChannelMask, sizeof(channelMask), channelMask)); - VerifyOrExit(channelMask.IsValid(),); + VerifyOrExit(channelMask.IsValid(), ;); mChannelMask = channelMask.GetMask(); mChannelMaskCurrent = mChannelMask; @@ -104,40 +105,14 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c mTimer.Start(kScanDelay); mCommissioner = aMessageInfo.GetPeerAddr(); - SendResponse(aHeader, aMessageInfo); - -exit: - return; -} - -ThreadError EnergyScanServer::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error = kThreadError_None; - Message *message = NULL; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo(aRequestInfo); - - VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo)); otLogInfoMeshCoP("sent energy scan query response"); exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; + return; } void EnergyScanServer::HandleTimer(void *aContext) diff --git a/src/core/thread/energy_scan_server.hpp b/src/core/thread/energy_scan_server.hpp index 8fecce7d6..de37561f4 100644 --- a/src/core/thread/energy_scan_server.hpp +++ b/src/core/thread/energy_scan_server.hpp @@ -84,7 +84,6 @@ private: void HandleNetifStateChanged(uint32_t aFlags); ThreadError SendReport(void); - ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo); Ip6::Address mCommissioner; uint32_t mChannelMask; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index f02b1fdda..830c7102e 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3990,34 +3990,13 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage, memcmp(&router->mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(router->mMacAddr)) == 0,); ReleaseRouterId(routerId); - SendAddressReleaseResponse(aHeader, aMessageInfo); -exit: - {} -} - -void MleRouter::SendAddressReleaseResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) -{ - ThreadError error = kThreadError_None; - Coap::Header responseHeader; - Message *message; - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo)); otLogInfoMle("Sent address release response"); exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } + {} } void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) diff --git a/src/core/thread/mle_router_ftd.hpp b/src/core/thread/mle_router_ftd.hpp index b557cc233..1130c48a1 100644 --- a/src/core/thread/mle_router_ftd.hpp +++ b/src/core/thread/mle_router_ftd.hpp @@ -746,7 +746,6 @@ private: ThreadError SendAddressRelease(void); void SendAddressSolicitResponse(const Coap::Header &aRequest, uint8_t aRouterId, const Ip6::MessageInfo &aMessageInfo); - void SendAddressReleaseResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo); ThreadError SendAdvertisement(void); ThreadError SendLinkRequest(Neighbor *aNeighbor); ThreadError SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor, diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 113e4338f..3b3a1128e 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -167,7 +167,9 @@ void Leader::HandleServerData(Coap::Header &aHeader, Message &aMessage, networkData.GetTlvs(), networkData.GetLength()); } - SendServerDataResponse(aHeader, aMessageInfo, NULL, 0); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo)); + + otLogInfoNetData("Sent network data registration acknowledgment"); exit: return; @@ -289,37 +291,6 @@ void Leader::HandleCommissioningGet(Coap::Header &aHeader, Message &aMessage, co SendCommissioningGetResponse(aHeader, aMessageInfo, tlvs, length); } -void Leader::SendServerDataResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, - const uint8_t *aTlvs, uint8_t aTlvsLength) -{ - ThreadError error = kThreadError_None; - Coap::Header responseHeader; - Message *message; - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - if (aTlvsLength > 0) - { - responseHeader.SetPayloadMarker(); - } - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - SuccessOrExit(error = message->Append(aTlvs, aTlvsLength)); - - SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); - - otLogInfoNetData("Sent network data registration acknowledgment"); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } -} - void Leader::SendCommissioningGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, uint8_t *aTlvs, uint8_t aLength) { diff --git a/src/core/thread/network_data_leader_ftd.hpp b/src/core/thread/network_data_leader_ftd.hpp index 1a1866e3f..5ab8278c6 100644 --- a/src/core/thread/network_data_leader_ftd.hpp +++ b/src/core/thread/network_data_leader_ftd.hpp @@ -144,8 +144,6 @@ private: static void HandleServerData(void *aContext, otCoapHeader *aHeader, otMessage aMessage, const otMessageInfo *aMessageInfo); void HandleServerData(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - void SendServerDataResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, - const uint8_t *aTlvs, uint8_t aTlvsLength); static void HandleTimer(void *aContext); void HandleTimer(void); diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 681aaa7f3..28ef9745e 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -81,31 +81,6 @@ void NetworkDiagnostic::SetReceiveDiagnosticGetCallback(otReceiveDiagnosticGetCa mReceiveDiagnosticGetCallbackContext = aCallbackContext; } -ThreadError NetworkDiagnostic::SendEmptyAck(Coap::Header &aHeader, const Ip6::MessageInfo &aMessageInfo) -{ - ThreadError error = kThreadError_None; - Message *message = NULL; - Coap::Header header; - Ip6::MessageInfo messageInfo(aMessageInfo); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - header.SetDefaultResponseHeader(aHeader); - - SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength())); - - SuccessOrExit(error = mCoapServer.SendMessage(*message, messageInfo)); - -exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; -} - ThreadError NetworkDiagnostic::SendDiagnosticGet(const Ip6::Address &aDestination, const uint8_t aTlvTypes[], uint8_t aCount) { @@ -192,8 +167,6 @@ void NetworkDiagnostic::HandleDiagnosticGetAnswer(void *aContext, otCoapHeader * void NetworkDiagnostic::HandleDiagnosticGetAnswer(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - ThreadError error = kThreadError_None; - VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable && aHeader.GetCode() == kCoapRequestPost, ;); @@ -204,7 +177,7 @@ void NetworkDiagnostic::HandleDiagnosticGetAnswer(Coap::Header &aHeader, Message mReceiveDiagnosticGetCallback(&aMessage, &aMessageInfo, mReceiveDiagnosticGetCallbackContext); } - SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo)); otLogInfoNetDiag("Sent diagnostic answer acknowledgment"); @@ -471,9 +444,10 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Header &aHeader, Message // DIAG_GET.qry may be sent as a confirmable message. if (aHeader.GetType() == kCoapTypeConfirmable) { - SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo)); - - otLogInfoNetDiag("Sent diagnostic get query acknowledgment"); + if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None) + { + otLogInfoNetDiag("Sent diagnostic get query acknowledgment"); + } } header.Init(kCoapTypeConfirmable, kCoapRequestPost); @@ -607,8 +581,6 @@ void NetworkDiagnostic::HandleDiagnosticReset(void *aContext, otCoapHeader *aHea void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - ThreadError error = kThreadError_None; - Message *message = NULL; uint16_t offset = 0; uint8_t type; NetworkDiagnosticTlv networkDiagnosticTlv; @@ -616,20 +588,20 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM otLogInfoNetDiag("Received diagnostic reset request"); VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable && - aHeader.GetCode() == kCoapRequestPost, error = kThreadError_Drop); + aHeader.GetCode() == kCoapRequestPost, ;); VerifyOrExit((aMessage.Read(aMessage.GetOffset(), sizeof(NetworkDiagnosticTlv), - &networkDiagnosticTlv) == sizeof(NetworkDiagnosticTlv)), error = kThreadError_Drop); + &networkDiagnosticTlv) == sizeof(NetworkDiagnosticTlv)), ;); - VerifyOrExit(networkDiagnosticTlv.GetType() == NetworkDiagnosticTlv::kTypeList, error = kThreadError_Drop); + VerifyOrExit(networkDiagnosticTlv.GetType() == NetworkDiagnosticTlv::kTypeList, ;); - VerifyOrExit((static_cast(&networkDiagnosticTlv)->IsValid()), error = kThreadError_Drop); + VerifyOrExit((static_cast(&networkDiagnosticTlv)->IsValid()), ;); offset = aMessage.GetOffset() + sizeof(NetworkDiagnosticTlv); for (uint8_t i = 0; i < networkDiagnosticTlv.GetLength(); i++) { - VerifyOrExit(aMessage.Read(offset, sizeof(type), &type) == sizeof(type), error = kThreadError_Drop); + VerifyOrExit(aMessage.Read(offset, sizeof(type), &type) == sizeof(type), ;); switch (type) { @@ -644,16 +616,12 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM } } - SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo)); otLogInfoNetDiag("Sent diagnostic reset acknowledgment"); exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } + return; } } // namespace NetworkDiagnostic diff --git a/src/core/thread/network_diagnostic.hpp b/src/core/thread/network_diagnostic.hpp index ee4698813..919e3576a 100644 --- a/src/core/thread/network_diagnostic.hpp +++ b/src/core/thread/network_diagnostic.hpp @@ -109,7 +109,6 @@ private: ThreadError AppendIPv6AddressList(Message &aMessage); ThreadError AppendChildTable(Message &aMessage); ThreadError FillRequestedTlvs(Message &aRequest, Message &aResponse, NetworkDiagnosticTlv &aNetworkDiagnosticTlv); - ThreadError SendEmptyAck(Coap::Header &aHeader, const Ip6::MessageInfo &aMessageInfo); static void HandleDiagnosticGetRequest(void *aContext, otCoapHeader *aHeader, otMessage aMessage, const otMessageInfo *aMessageInfo); diff --git a/src/core/thread/panid_query_server.cpp b/src/core/thread/panid_query_server.cpp index 59e4b05e5..7952b4dbd 100644 --- a/src/core/thread/panid_query_server.cpp +++ b/src/core/thread/panid_query_server.cpp @@ -69,6 +69,7 @@ void PanIdQueryServer::HandleQuery(Coap::Header &aHeader, Message &aMessage, con { MeshCoP::PanIdTlv panId; MeshCoP::ChannelMask0Tlv channelMask; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;); @@ -83,42 +84,13 @@ void PanIdQueryServer::HandleQuery(Coap::Header &aHeader, Message &aMessage, con mPanId = panId.GetPanId(); mTimer.Start(kScanDelay); - SendQueryResponse(aHeader, aMessageInfo); - -exit: - return; -} - -ThreadError PanIdQueryServer::SendQueryResponse(const Coap::Header &aRequestHeader, - const Ip6::MessageInfo &aRequestInfo) -{ - ThreadError error = kThreadError_None; - Message *message = NULL; - Coap::Header responseHeader; - Ip6::MessageInfo responseInfo; - - VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;); - - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); - - responseHeader.SetDefaultResponseHeader(aRequestHeader); - - SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); - - memcpy(&responseInfo, &aRequestInfo, sizeof(responseInfo)); memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr)); - SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo)); + SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo)); otLogInfoMeshCoP("sent panid query response"); exit: - - if (error != kThreadError_None && message != NULL) - { - message->Free(); - } - - return error; + return; } void PanIdQueryServer::HandleScanResult(void *aContext, Mac::Frame *aFrame) diff --git a/src/core/thread/panid_query_server.hpp b/src/core/thread/panid_query_server.hpp index bed352d88..3bfc76ff0 100644 --- a/src/core/thread/panid_query_server.hpp +++ b/src/core/thread/panid_query_server.hpp @@ -81,7 +81,6 @@ private: static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo); ThreadError SendConflict(void); - ThreadError SendQueryResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo); Ip6::Address mCommissioner; uint32_t mChannelMask;