mirror of
https://github.com/espressif/openthread.git
synced 2026-10-07 08:17:40 +00:00
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:
committed by
Jonathan Hui
parent
9c12733366
commit
4ad1aefaf0
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user