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.
This commit is contained in:
Abtin Keshavarzian
2017-01-05 08:55:41 -08:00
committed by Jonathan Hui
parent 9c12733366
commit 4ad1aefaf0
5 changed files with 46 additions and 44 deletions
+2 -2
View File
@@ -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;
+2 -2
View File
@@ -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;
+23 -14
View File
@@ -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<uint8_t>(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
+10 -8
View File
@@ -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,
+9 -18
View File
@@ -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));