mirror of
https://github.com/espressif/openthread.git
synced 2026-09-22 17:07:37 +00:00
enable mac security for fragmented mle message (#1202)
This commit is contained in:
@@ -372,6 +372,21 @@ void Message::SetSubType(uint8_t aSubType)
|
||||
mInfo.mSubType = aSubType;
|
||||
}
|
||||
|
||||
bool Message::IsSubTypeMle(void) const
|
||||
{
|
||||
bool rval = false;
|
||||
|
||||
if (mInfo.mSubType == kSubTypeMleAnnounce ||
|
||||
mInfo.mSubType == kSubTypeMleDiscoverRequest ||
|
||||
mInfo.mSubType == kSubTypeMleDiscoverResponse ||
|
||||
mInfo.mSubType == kSubTypeMleGeneral)
|
||||
{
|
||||
rval = true;
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
uint8_t Message::GetPriority(void) const
|
||||
{
|
||||
return mInfo.mPriority;
|
||||
|
||||
@@ -215,6 +215,7 @@ public:
|
||||
kSubTypeMleDiscoverResponse = 3, ///< MLE Discover Response
|
||||
kSubTypeJoinerEntrust = 4, ///< Joiner Entrust
|
||||
kSubTypeMplRetransmission = 5, ///< MPL next retranmission message
|
||||
kSubTypeMleGeneral = 6, ///< General MLE
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -320,6 +321,15 @@ public:
|
||||
*/
|
||||
void SetSubType(uint8_t aSubType);
|
||||
|
||||
/**
|
||||
* This method returns whether or not the message is of MLE subtype.
|
||||
*
|
||||
* @retval TRUE If message is of MLE subtype.
|
||||
* @retval FLASE If message is not of MLE subtype.
|
||||
*
|
||||
*/
|
||||
bool IsSubTypeMle(void) const;
|
||||
|
||||
/**
|
||||
* This method returns the message priority level.
|
||||
*
|
||||
|
||||
@@ -989,7 +989,11 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
|
||||
aFrame.SetChannel(mScanChannel);
|
||||
}
|
||||
|
||||
SendFragment(*mSendMessage, aFrame);
|
||||
if (SendFragment(*mSendMessage, aFrame) == kThreadError_NotCapable)
|
||||
{
|
||||
SendFragment(*mSendMessage, aFrame);
|
||||
}
|
||||
|
||||
assert(aFrame.GetLength() != 7);
|
||||
break;
|
||||
|
||||
@@ -1115,6 +1119,7 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
|
||||
uint16_t fragmentLength;
|
||||
uint16_t dstpan;
|
||||
uint8_t secCtl = Mac::Frame::kSecNone;
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
if (mAddMeshHeader)
|
||||
{
|
||||
@@ -1254,6 +1259,13 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
|
||||
|
||||
if (payloadLength > fragmentLength)
|
||||
{
|
||||
if ((!aMessage.IsLinkSecurityEnabled()) && aMessage.IsSubTypeMle())
|
||||
{
|
||||
aMessage.SetLinkSecurityEnabled(true);
|
||||
aMessage.SetOffset(0);
|
||||
ExitNow(error = kThreadError_NotCapable);
|
||||
}
|
||||
|
||||
// write Fragment header
|
||||
if (aMessage.GetDatagramTag() == 0)
|
||||
{
|
||||
@@ -1322,7 +1334,9 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
|
||||
aFrame.SetFramePending(true);
|
||||
}
|
||||
|
||||
return kThreadError_None;
|
||||
exit:
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError MeshForwarder::SendEmptyFrame(Mac::Frame &aFrame)
|
||||
|
||||
@@ -882,6 +882,7 @@ Message *Mle::NewMleMessage(void)
|
||||
message = mSocket.NewMessage(0);
|
||||
VerifyOrExit(message != NULL, ;);
|
||||
|
||||
message->SetSubType(Message::kSubTypeMleGeneral);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
message->SetPriority(kMleMessagePriority);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user