From 4ad1aefaf0c5b79f3e6c0a610715d5578ad198d3 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 5 Jan 2017 08:55:41 -0800 Subject: [PATCH] Prioritize MLE traffic over data messages (#1106) This commit changes the `mSendQueue` in `Ip6` and `MeshForwarder` to use `PriorityQueue`. It also assigns higher priority to MLE message over data traffic thus ensuring the MLE message are send out before data traffic. --- src/core/net/ip6.hpp | 4 ++-- src/core/thread/mesh_forwarder.hpp | 4 ++-- src/core/thread/mle.cpp | 37 +++++++++++++++++++----------- src/core/thread/mle.hpp | 18 ++++++++------- src/core/thread/mle_router.cpp | 27 ++++++++-------------- 5 files changed, 46 insertions(+), 44 deletions(-) diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index eabbdc4aa..318a644a7 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -344,7 +344,7 @@ public: * @returns A reference to the send queue. * */ - const MessageQueue &GetSendQueue(void) const { return mSendQueue; } + const PriorityQueue &GetSendQueue(void) const { return mSendQueue; } Routes mRoutes; Icmp mIcmp; @@ -373,7 +373,7 @@ private: bool mForwardingEnabled; - MessageQueue mSendQueue; + PriorityQueue mSendQueue; Tasklet mSendQueueTask; otReceiveIp6DatagramCallback mReceiveIp6DatagramCallback; diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index 2a4bbaa8a..7ec340fb1 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -194,7 +194,7 @@ public: * @returns A reference to the send queue. * */ - const MessageQueue &GetSendQueue(void) const { return mSendQueue; } + const PriorityQueue &GetSendQueue(void) const { return mSendQueue; } /** * This method returns a reference to the reassembly queue. @@ -271,7 +271,7 @@ private: Timer mPollTimer; Timer mReassemblyTimer; - MessageQueue mSendQueue; + PriorityQueue mSendQueue; MessageQueue mReassemblyList; MessageQueue mResolvingQueue; uint16_t mFragTag; diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 29346d1a0..ad2bcf28b 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -356,8 +356,7 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16 mDiscoverContext = aContext; mMesh.SetDiscoverParameters(aScanChannels, aScanDuration); - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); message->SetSubType(Message::kSubTypeMleDiscoverRequest); message->SetPanId(aPanId); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDiscoveryRequest)); @@ -863,6 +862,20 @@ void Mle::GenerateNonce(const Mac::ExtAddress &aMacAddr, uint32_t aFrameCounter, aNonce[0] = aSecurityLevel; } +Message *Mle::NewMleMessage(void) +{ + Message *message; + + message = mSocket.NewMessage(0); + VerifyOrExit(message != NULL, ;); + + message->SetLinkSecurityEnabled(false); + message->SetPriority(kMleMessagePriority); + +exit: + return message; +} + ThreadError Mle::AppendHeader(Message &aMessage, Header::Command aCommand) { ThreadError error = kThreadError_None; @@ -1348,8 +1361,7 @@ ThreadError Mle::SendParentRequest(void) mParentRequest.mChallenge[i] = static_cast(otPlatRandomGet()); } - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentRequest)); SuccessOrExit(error = AppendMode(*message, mDeviceMode)); SuccessOrExit(error = AppendChallenge(*message, mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge))); @@ -1415,8 +1427,7 @@ ThreadError Mle::SendChildIdRequest(void) Message *message; Ip6::Address destination; - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdRequest)); SuccessOrExit(error = AppendResponse(*message, mChildIdRequest.mChallenge, mChildIdRequest.mChallengeLength)); SuccessOrExit(error = AppendLinkFrameCounter(*message)); @@ -1464,8 +1475,7 @@ ThreadError Mle::SendDataRequest(const Ip6::Address &aDestination, const uint8_t ThreadError error = kThreadError_None; Message *message; - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataRequest)); SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength)); SuccessOrExit(error = AppendActiveTimestamp(*message, false)); @@ -1510,8 +1520,7 @@ ThreadError Mle::SendChildUpdateRequest(void) Ip6::Address destination; Message *message; - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest)); SuccessOrExit(error = AppendMode(*message, mDeviceMode)); @@ -1574,8 +1583,7 @@ ThreadError Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, Ip6::Address destination; Message *message; - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -1636,7 +1644,8 @@ ThreadError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce) Ip6::Address destination; Message *message; - VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); + message->SetLinkSecurityEnabled(true); message->SetSubType(Message::kSubTypeMleAnnounce); message->SetChannel(aChannel); SuccessOrExit(error = AppendHeader(*message, Header::kCommandAnnounce)); @@ -1706,7 +1715,7 @@ void Mle::SendOrphanAnnounce(void) VerifyOrExit(channel != mAnnounceChannel,); } - // Send Annuonce message + // Send Announce message SendAnnounce(channel, true); // Move to next channel diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 64ed29bc6..edc1b5606 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -772,6 +772,15 @@ public: void FillNetworkDataTlv(NetworkDataTlv &aTlv, bool aStableOnly); protected: + + /** + * This method allocates a new message buffer for preparing an MLE message. + * + * @returns A pointer to the message or NULL if insufficient message buffers are available. + * + */ + Message *NewMleMessage(void); + /** * This method appends an MLE header to a message. * @@ -1144,14 +1153,6 @@ protected: */ ThreadError SetStateChild(uint16_t aRloc16); - /** - * This method returns a new MLE message. - * - * @returns A pointer to the message or NULL if no buffers are available. - * - */ - Message *NewMessage(void) { return mSocket.NewMessage(0); }; - /** * This method sets the Leader's Partition ID, Weighting, and Router ID values. * @@ -1220,6 +1221,7 @@ private: enum { kAttachDataPollPeriod = OPENTHREAD_CONFIG_ATTACH_DATA_POLL_PERIOD, + kMleMessagePriority = Message::kPriorityHigh, }; void GenerateNonce(const Mac::ExtAddress &aMacAddr, uint32_t aFrameCounter, uint8_t aSecurityLevel, diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 090e41fe7..d48c59194 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -531,8 +531,7 @@ ThreadError MleRouter::SendAdvertisement(void) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandAdvertisement)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -580,8 +579,7 @@ ThreadError MleRouter::SendLinkRequest(Neighbor *aNeighbor) memset(&destination, 0, sizeof(destination)); - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandLinkRequest)); SuccessOrExit(error = AppendVersion(*message)); @@ -757,8 +755,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig command = (aNeighbor == NULL || aNeighbor->mState == Neighbor::kStateValid) ? Header::kCommandLinkAccept : Header::kCommandLinkAcceptAndRequest; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, command)); SuccessOrExit(error = AppendVersion(*message)); SuccessOrExit(error = AppendSourceAddress(*message)); @@ -1959,8 +1956,7 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha Message *message; uint16_t delay; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -2584,8 +2580,7 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u MeshCoP::JoinerUdpPortTlv joinerUdpPort; MeshCoP::Tlv *steeringData; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); message->SetSubType(Message::kSubTypeMleDiscoverResponse); message->SetPanId(aPanId); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDiscoveryResponse)); @@ -2657,8 +2652,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -2743,8 +2737,7 @@ ThreadError MleRouter::SendChildUpdateRequest(Child *aChild) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -2783,8 +2776,7 @@ ThreadError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::Message ThreadError error = kThreadError_None; Message *message; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateResponse)); for (int i = 0; i < aTlvslength; i++) @@ -2846,8 +2838,7 @@ ThreadError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const Neighbor *neighbor; bool stableOnly; - VerifyOrExit((message = NewMessage()) != NULL, ;); - message->SetLinkSecurityEnabled(false); + VerifyOrExit((message = NewMleMessage()) != NULL, ;); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message));