From 344a6829c9e53f60d01e4dce979dc5e66271957d Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Tue, 17 Jan 2017 12:19:33 +0800 Subject: [PATCH] Set MeshCoP message to high priority (#1161) * Add NewMeshCoPMessage() functions to create MeshCoP message * Set all of the MeshCoP messages to high priority --- src/core/coap/coap_base.cpp | 12 +++++++++ src/core/coap/coap_base.hpp | 15 +++++++++++ src/core/coap/coap_server.cpp | 12 +++++++++ src/core/coap/coap_server.hpp | 30 +++++++++++++++++---- src/core/meshcop/announce_begin_client.cpp | 2 +- src/core/meshcop/commissioner.cpp | 12 ++++----- src/core/meshcop/dataset_manager.cpp | 10 +++---- src/core/meshcop/energy_scan_client.cpp | 2 +- src/core/meshcop/joiner.cpp | 4 +-- src/core/meshcop/joiner_router.cpp | 4 ++- src/core/meshcop/joiner_router_ftd.hpp | 1 + src/core/meshcop/leader.cpp | 6 ++--- src/core/meshcop/panid_query_client.cpp | 2 +- src/core/thread/energy_scan_server.cpp | 2 +- src/core/thread/network_data_leader_ftd.cpp | 4 +-- src/core/thread/panid_query_server.cpp | 2 +- 16 files changed, 91 insertions(+), 29 deletions(-) diff --git a/src/core/coap/coap_base.cpp b/src/core/coap/coap_base.cpp index 0852b432c..2316dc2e2 100644 --- a/src/core/coap/coap_base.cpp +++ b/src/core/coap/coap_base.cpp @@ -52,6 +52,18 @@ exit: return message; } +Message *CoapBase::NewMeshCoPMessage(const Header &aHeader) +{ + Message *message = NULL; + + VerifyOrExit((message = NewMessage(aHeader)) != NULL, ;); + + message->SetPriority(kMeshCoPMessagePriority); + +exit: + return message; +} + ThreadError CoapBase::Start(const Ip6::SockAddr &aSockAddr) { ThreadError error; diff --git a/src/core/coap/coap_base.hpp b/src/core/coap/coap_base.hpp index 3d79db12f..e3a448103 100644 --- a/src/core/coap/coap_base.hpp +++ b/src/core/coap/coap_base.hpp @@ -50,6 +50,11 @@ namespace Coap { * */ +enum +{ + kMeshCoPMessagePriority = Message::kPriorityHigh, // The priority for MeshCoP message +}; + /** * This class implements a common code base for CoAP client/server. * @@ -101,6 +106,16 @@ public: */ Message *NewMessage(const Header &aHeader); + /** + * This method creates a new MeshCoP message with a CoAP header. + * + * @param[in] aHeader A reference to a CoAP header that is used to create the message. + * + * @returns A pointer to the MeshCoP message or NULL if failed to allocate message. + * + */ + Message *NewMeshCoPMessage(const Header &aHeader); + /** * This method returns a port number used by CoAP client. * diff --git a/src/core/coap/coap_server.cpp b/src/core/coap/coap_server.cpp index 3e80530fc..ad4d9d5a9 100644 --- a/src/core/coap/coap_server.cpp +++ b/src/core/coap/coap_server.cpp @@ -100,6 +100,18 @@ Message *Server::NewMessage(uint16_t aReserved) return mSocket.NewMessage(aReserved); } +Message *Server::NewMeshCoPMessage(uint16_t aReserved) +{ + Message *message = NULL; + + VerifyOrExit((message = NewMessage(aReserved)) != NULL, ;); + + message->SetPriority(kMeshCoPMessagePriority); + +exit: + return message; +} + ThreadError Server::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { return mSender(this, aMessage, aMessageInfo); diff --git a/src/core/coap/coap_server.hpp b/src/core/coap/coap_server.hpp index acf7c2191..a2d3d5e25 100644 --- a/src/core/coap/coap_server.hpp +++ b/src/core/coap/coap_server.hpp @@ -156,6 +156,16 @@ public: */ Message *NewMessage(uint16_t aReserved); + /** + * This method returns a new MeshCoP message with sufficient header space reserved. + * + * @param[in] aReserved The number of header bytes to reserve after the UDP header. + * + * @returns A pointer to the MeshCoP message or NULL if no buffers are available. + * + */ + Message *NewMeshCoPMessage(uint16_t aReserved); + /** * This method creates a new message with a CoAP header. * @@ -167,15 +177,25 @@ public: Message *NewMessage(const Header &aHeader) { return CoapBase::NewMessage(aHeader); }; /** - * This method sends a CoAP response from the server. + * This method creates a new MeshCoP message with a CoAP header. * - * @param[in] aMessage The CoAP response to send. - * @param[in] aMessageInfo The message info corresponding to @p aMessage. + * @param[in] aHeader A reference to a CoAP header that is used to create the message. * - * @retval kThreadError_None Successfully enqueued the CoAP response message. - * @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response. + * @returns A pointer to the MeshCoP message or NULL if failed to allocate message. * */ + Message *NewMeshCoPMessage(const Header &aHeader) { return CoapBase::NewMeshCoPMessage(aHeader); }; + + /** + * This method sends a CoAP response from the server. + * + * @param[in] aMessage The CoAP response to send. + * @param[in] aMessageInfo The message info corresponding to @p aMessage. + * + * @retval kThreadError_None Successfully enqueued the CoAP response message. + * @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response. + * + */ ThreadError SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo); /** diff --git a/src/core/meshcop/announce_begin_client.cpp b/src/core/meshcop/announce_begin_client.cpp index 9f428ec3f..2a552a7e9 100644 --- a/src/core/meshcop/announce_begin_client.cpp +++ b/src/core/meshcop/announce_begin_client.cpp @@ -76,7 +76,7 @@ ThreadError AnnounceBeginClient::SendRequest(uint32_t aChannelMask, uint8_t aCou header.AppendUriPathOptions(OPENTHREAD_URI_ANNOUNCE_BEGIN); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); sessionId.Init(); sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId()); diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 2564c76a7..262f83304 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -332,7 +332,7 @@ ThreadError Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, header.SetPayloadMarker(); } - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); if (aLength > 0) { @@ -398,7 +398,7 @@ ThreadError Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDa header.AppendUriPathOptions(OPENTHREAD_URI_COMMISSIONER_SET); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); if (aDataset.mIsLocatorSet) { @@ -496,7 +496,7 @@ ThreadError Commissioner::SendPetition(void) header.AppendUriPathOptions(OPENTHREAD_URI_LEADER_PETITION); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); commissionerId.Init(); commissionerId.SetCommissionerId("OpenThread Commissioner"); @@ -592,7 +592,7 @@ ThreadError Commissioner::SendKeepAlive(void) header.AppendUriPathOptions(OPENTHREAD_URI_LEADER_KEEP_ALIVE); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); state.Init(); state.SetState(mState == kStateActive ? StateTlv::kAccept : StateTlv::kReject); @@ -821,7 +821,7 @@ void Commissioner::SendJoinFinalizeResponse(const Coap::Header &aRequestHeader, responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); - VerifyOrExit((message = mSecureCoapServer.NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mSecureCoapServer.NewMeshCoPMessage(responseHeader)) != NULL, error = kThreadError_NoBufs); stateTlv.Init(); stateTlv.SetState(aState); @@ -871,7 +871,7 @@ ThreadError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::Messag header.AppendUriPathOptions(OPENTHREAD_URI_RELAY_TX); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); udpPort.Init(); udpPort.SetUdpPort(mJoinerPort); diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 8629782a2..820eccbc8 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -292,7 +292,7 @@ ThreadError DatasetManager::Register(void) pending->UpdateDelayTimer(); } - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = message->Append(mLocal.GetBytes(), mLocal.GetSize())); @@ -556,7 +556,7 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, header.AppendUriPathOptions(mUriSet); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); #if OPENTHREAD_ENABLE_COMMISSIONER bool isCommissioner; @@ -711,7 +711,7 @@ ThreadError DatasetManager::SendGetRequest(const uint8_t *aTlvTypes, const uint8 header.AppendUriPathOptions(mUriGet); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); if (aLength > 0) { @@ -753,7 +753,7 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I Message *message; StateTlv state; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); @@ -785,7 +785,7 @@ void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const I Message *message; uint8_t index; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); diff --git a/src/core/meshcop/energy_scan_client.cpp b/src/core/meshcop/energy_scan_client.cpp index bebe26219..db33c1b55 100644 --- a/src/core/meshcop/energy_scan_client.cpp +++ b/src/core/meshcop/energy_scan_client.cpp @@ -80,7 +80,7 @@ ThreadError EnergyScanClient::SendQuery(uint32_t aChannelMask, uint8_t aCount, u header.AppendUriPathOptions(OPENTHREAD_URI_ENERGY_SCAN); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); sessionId.Init(); sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId()); diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index 29679d0fe..df1259b94 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -261,7 +261,7 @@ void Joiner::SendJoinerFinalize(void) header.AppendUriPathOptions(OPENTHREAD_URI_JOINER_FINALIZE); header.SetPayloadMarker(); - VerifyOrExit((message = mSecureCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mSecureCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); stateTlv.Init(); stateTlv.SetState(MeshCoP::StateTlv::kAccept); @@ -430,7 +430,7 @@ void Joiner::SendJoinerEntrustResponse(const Coap::Header &aRequestHeader, otLogFuncEntry(); - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeJoinerEntrust); responseHeader.SetDefaultResponseHeader(aRequestHeader); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index 2bed446a8..39d776337 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -169,6 +169,7 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a SuccessOrExit(error = GetBorderAgentRloc(borderAgentRloc)); VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + message->SetPriority(kMeshCoPMessagePriority); header.Init(kCoapTypeNonConfirmable, kCoapRequestPost); header.SetMessageId(0); @@ -261,6 +262,7 @@ void JoinerRouter::HandleRelayTransmit(Coap::Header &aHeader, Message &aMessage, SuccessOrExit(error = Tlv::GetValueOffset(aMessage, Tlv::kJoinerDtlsEncapsulation, offset, length)); VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + message->SetPriority(kMeshCoPMessagePriority); message->SetLinkSecurityEnabled(false); while (length) @@ -327,7 +329,7 @@ ThreadError JoinerRouter::SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo header.AppendUriPathOptions(OPENTHREAD_URI_JOINER_ENTRUST); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeJoinerEntrust); masterKey.Init(); diff --git a/src/core/meshcop/joiner_router_ftd.hpp b/src/core/meshcop/joiner_router_ftd.hpp index f61ee381c..98a29b85e 100644 --- a/src/core/meshcop/joiner_router_ftd.hpp +++ b/src/core/meshcop/joiner_router_ftd.hpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include diff --git a/src/core/meshcop/leader.cpp b/src/core/meshcop/leader.cpp index 517ea3d20..7f84822c4 100644 --- a/src/core/meshcop/leader.cpp +++ b/src/core/meshcop/leader.cpp @@ -113,7 +113,7 @@ ThreadError Leader::SendPetitionResponse(const Coap::Header &aRequestHeader, con CommissionerSessionIdTlv sessionId; Message *message; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); @@ -203,7 +203,7 @@ ThreadError Leader::SendKeepAliveResponse(const Coap::Header &aRequestHeader, co StateTlv state; Message *message; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); @@ -239,7 +239,7 @@ ThreadError Leader::SendDatasetChanged(const Ip6::Address &aAddress) header.SetToken(Coap::Header::kDefaultTokenLength); header.AppendUriPathOptions(OPENTHREAD_URI_DATASET_CHANGED); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); messageInfo.SetPeerAddr(aAddress); messageInfo.SetPeerPort(kCoapUdpPort); diff --git a/src/core/meshcop/panid_query_client.cpp b/src/core/meshcop/panid_query_client.cpp index 53c212954..575e7656a 100644 --- a/src/core/meshcop/panid_query_client.cpp +++ b/src/core/meshcop/panid_query_client.cpp @@ -73,7 +73,7 @@ ThreadError PanIdQueryClient::SendQuery(uint16_t aPanId, uint32_t aChannelMask, header.AppendUriPathOptions(OPENTHREAD_URI_PANID_QUERY); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); sessionId.Init(); sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId()); diff --git a/src/core/thread/energy_scan_server.cpp b/src/core/thread/energy_scan_server.cpp index 280fdd6c8..65ffc8b66 100644 --- a/src/core/thread/energy_scan_server.cpp +++ b/src/core/thread/energy_scan_server.cpp @@ -191,7 +191,7 @@ ThreadError EnergyScanServer::SendReport(void) header.AppendUriPathOptions(OPENTHREAD_URI_ENERGY_REPORT); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); channelMask.Init(); channelMask.SetMask(mChannelMask); diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 3b3a1128e..6122ee90f 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -301,7 +301,7 @@ void Leader::SendCommissioningGetResponse(const Coap::Header &aRequestHeader, co uint8_t *data = NULL; uint8_t length = 0; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); @@ -363,7 +363,7 @@ void Leader::SendCommissioningSetResponse(const Coap::Header &aRequestHeader, co Message *message; MeshCoP::StateTlv state; - VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.SetDefaultResponseHeader(aRequestHeader); responseHeader.SetPayloadMarker(); diff --git a/src/core/thread/panid_query_server.cpp b/src/core/thread/panid_query_server.cpp index 7952b4dbd..edf1eac04 100644 --- a/src/core/thread/panid_query_server.cpp +++ b/src/core/thread/panid_query_server.cpp @@ -131,7 +131,7 @@ ThreadError PanIdQueryServer::SendConflict(void) header.AppendUriPathOptions(OPENTHREAD_URI_PANID_CONFLICT); header.SetPayloadMarker(); - VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs); channelMask.Init(); channelMask.SetMask(mChannelMask);