enable mac security for fragmented mle message (#1202)

This commit is contained in:
rongli
2017-01-24 19:06:26 -08:00
committed by Jonathan Hui
parent 53bcbb9012
commit bbec8132e4
4 changed files with 42 additions and 2 deletions
+15
View File
@@ -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;
+10
View File
@@ -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.
*
+16 -2
View File
@@ -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)
+1
View File
@@ -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);