[mle] enhance NewMleMessage() to prepare the MLE header (#7633)

This commit updates `NewMleMessage()` to allocate and also
initialize an MLE message adding MLE header and setting the
`Message::SubType`.
This commit is contained in:
Abtin Keshavarzian
2022-05-02 09:34:17 -07:00
committed by GitHub
parent 0347022854
commit c5fbc45573
4 changed files with 64 additions and 80 deletions
+1 -3
View File
@@ -105,10 +105,8 @@ Error DiscoverScanner::Discover(const Mac::ChannelMask &aScanChannels,
mScanChannels.Intersect(aScanChannels);
}
VerifyOrExit((message = Get<Mle>().NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDiscoverRequest);
VerifyOrExit((message = Get<Mle>().NewMleMessage(Mle::kCommandDiscoveryRequest)) != nullptr, error = kErrorNoBufs);
message->SetPanId(aPanId);
SuccessOrExit(error = Get<Mle>().AppendHeader(*message, Mle::kCommandDiscoveryRequest));
// Prepare sub-TLV MeshCoP Discovery Request.
discoveryRequest.Init();
+49 -39
View File
@@ -1031,37 +1031,59 @@ const LeaderData &Mle::GetLeaderData(void)
return mLeaderData;
}
Message *Mle::NewMleMessage(void)
Message *Mle::NewMleMessage(Command aCommand)
{
Error error = kErrorNone;
Message * message;
Message::Settings settings(Message::kNoLinkSecurity, Message::kPriorityNet);
Message::SubType subType;
uint8_t securitySuite;
message = mSocket.NewMessage(0, settings);
VerifyOrExit(message != nullptr);
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleGeneral);
exit:
return message;
}
Error Mle::AppendHeader(Message &aMessage, Command aCommand)
{
Error error = kErrorNone;
uint8_t securitySuite = k154Security;
securitySuite = k154Security;
subType = Message::kSubTypeMleGeneral;
switch (aCommand)
{
case kCommandAnnounce:
subType = Message::kSubTypeMleAnnounce;
break;
case kCommandDiscoveryRequest:
case kCommandDiscoveryResponse:
subType = Message::kSubTypeMleDiscoverRequest;
securitySuite = kNoSecurity;
break;
case kCommandDiscoveryResponse:
subType = Message::kSubTypeMleDiscoverResponse;
securitySuite = kNoSecurity;
break;
case kCommandChildUpdateRequest:
subType = Message::kSubTypeMleChildUpdateRequest;
break;
case kCommandDataResponse:
subType = Message::kSubTypeMleDataResponse;
break;
case kCommandChildIdRequest:
subType = Message::kSubTypeMleChildIdRequest;
break;
case kCommandDataRequest:
subType = Message::kSubTypeMleDataRequest;
break;
default:
break;
}
SuccessOrExit(error = aMessage.Append(securitySuite));
message->SetSubType(subType);
SuccessOrExit(error = message->Append(securitySuite));
if (securitySuite == k154Security)
{
@@ -1071,13 +1093,14 @@ Error Mle::AppendHeader(Message &aMessage, Command aCommand)
// message in `SendMessage()` before message is sent.
securityHeader.InitSecurityControl();
SuccessOrExit(error = aMessage.Append(securityHeader));
SuccessOrExit(error = message->Append(securityHeader));
}
error = aMessage.Append<uint8_t>(aCommand);
error = message->Append<uint8_t>(aCommand);
exit:
return error;
FreeAndNullMessageOnError(message, error);
return message;
}
Error Mle::AppendSourceAddress(Message &aMessage) const
@@ -2117,8 +2140,7 @@ void Mle::SendParentRequest(ParentRequestType aType)
break;
}
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandParentRequest));
VerifyOrExit((message = NewMleMessage(kCommandParentRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
SuccessOrExit(error = AppendChallenge(*message, mParentRequestChallenge));
SuccessOrExit(error = AppendScanMask(*message, scanMask));
@@ -2180,9 +2202,7 @@ Error Mle::SendChildIdRequest(void)
}
}
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildIdRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildIdRequest));
VerifyOrExit((message = NewMleMessage(kCommandChildIdRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendResponse(*message, mParentCandidateChallenge));
SuccessOrExit(error = AppendLinkFrameCounter(*message));
SuccessOrExit(error = AppendMleFrameCounter(*message));
@@ -2234,9 +2254,7 @@ Error Mle::SendDataRequest(const Ip6::Address &aDestination,
RemoveDelayedDataRequestMessage(aDestination);
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDataRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandDataRequest));
VerifyOrExit((message = NewMleMessage(kCommandDataRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength));
if (aExtraTlvs != nullptr && aExtraTlvsLength > 0)
@@ -2419,9 +2437,7 @@ Error Mle::SendChildUpdateRequest(void)
mChildUpdateRequestState = kChildUpdateRequestActive;
ScheduleMessageTransmissionTimer();
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildUpdateRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateRequest));
VerifyOrExit((message = NewMleMessage(kCommandChildUpdateRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
switch (mRole)
@@ -2488,8 +2504,7 @@ Error Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, const
Message * message;
bool checkAddress = false;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateResponse));
VerifyOrExit((message = NewMleMessage(kCommandChildUpdateResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
@@ -2574,11 +2589,9 @@ void Mle::SendAnnounce(uint8_t aChannel, const Ip6::Address &aDestination, Annou
Message * message = nullptr;
VerifyOrExit(Get<Mac::Mac>().GetSupportedChannelMask().ContainsChannel(aChannel), error = kErrorInvalidArgs);
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
VerifyOrExit((message = NewMleMessage(kCommandAnnounce)) != nullptr, error = kErrorNoBufs);
message->SetLinkSecurityEnabled(true);
message->SetSubType(Message::kSubTypeMleAnnounce);
message->SetChannel(aChannel);
SuccessOrExit(error = AppendHeader(*message, kCommandAnnounce));
channel.Init();
channel.SetChannelPage(0);
@@ -2639,8 +2652,7 @@ Error Mle::SendLinkMetricsManagementResponse(const Ip6::Address &aDestination, L
Tlv tlv;
ot::Tlv statusSubTlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkMetricsManagementResponse));
VerifyOrExit((message = NewMleMessage(kCommandLinkMetricsManagementResponse)) != nullptr, error = kErrorNoBufs);
tlv.SetType(Tlv::kLinkMetricsManagement);
statusSubTlv.SetType(LinkMetrics::SubTlv::kStatus);
@@ -2666,8 +2678,7 @@ Error Mle::SendLinkProbe(const Ip6::Address &aDestination, uint8_t aSeriesId, ui
Message *message;
Tlv tlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkProbe));
VerifyOrExit((message = NewMleMessage(kCommandLinkProbe)) != nullptr, error = kErrorNoBufs);
tlv.SetType(Tlv::kLinkProbe);
tlv.SetLength(sizeof(aSeriesId) + aLength);
@@ -4666,8 +4677,7 @@ Error Mle::SendLinkMetricsManagementRequest(const Ip6::Address &aDestination, co
Message *message;
Tlv tlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkMetricsManagementRequest));
VerifyOrExit((message = NewMleMessage(kCommandLinkMetricsManagementRequest)) != nullptr, error = kErrorNoBufs);
// Link Metrics Management TLV
tlv.SetType(Tlv::kLinkMetricsManagement);
+4 -14
View File
@@ -975,12 +975,14 @@ protected:
};
/**
* This method allocates a new message buffer for preparing an MLE message.
* This method allocates and initializes new MLE message for a given command.
*
* @param[in] aCommand The MLE command.
*
* @returns A pointer to the message or `nullptr` if insufficient message buffers are available.
*
*/
Message *NewMleMessage(void);
Message *NewMleMessage(Command aCommand);
/**
* This method sets the device role.
@@ -1006,18 +1008,6 @@ protected:
*/
void SetAttachState(AttachState aState);
/**
* This method appends an MLE header to a message.
*
* @param[in] aMessage A reference to the message.
* @param[in] aCommand The MLE Command Type.
*
* @retval kErrorNone Successfully appended the header.
* @retval kErrorNoBufs Insufficient buffers available to append the header.
*
*/
Error AppendHeader(Message &aMessage, Command aCommand);
/**
* This method appends a Source Address TLV to a message.
*
+10 -24
View File
@@ -496,8 +496,7 @@ void MleRouter::SendAdvertisement(void)
// children to detach.
VerifyOrExit(!mAddressSolicitPending);
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandAdvertisement));
VerifyOrExit((message = NewMleMessage(kCommandAdvertisement)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
@@ -538,8 +537,7 @@ Error MleRouter::SendLinkRequest(Neighbor *aNeighbor)
destination.Clear();
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkRequest));
VerifyOrExit((message = NewMleMessage(kCommandLinkRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendVersion(*message));
switch (mRole)
@@ -735,8 +733,7 @@ Error MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo,
command = (aNeighbor == nullptr || aNeighbor->IsStateValid()) ? kCommandLinkAccept : kCommandLinkAcceptAndRequest;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, command));
VerifyOrExit((message = NewMleMessage(command)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendVersion(*message));
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendResponse(*message, aChallenge));
@@ -1954,10 +1951,9 @@ void MleRouter::SendParentResponse(Child *aChild, const Challenge &aChallenge, b
Message * message;
uint16_t delay;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
VerifyOrExit((message = NewMleMessage(kCommandParentResponse)) != nullptr, error = kErrorNoBufs);
message->SetDirectTransmission();
SuccessOrExit(error = AppendHeader(*message, kCommandParentResponse));
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendLinkFrameCounter(*message));
@@ -2961,8 +2957,7 @@ Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const M
MeshCoP::NetworkNameTlv networkName;
uint16_t delay;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDiscoverResponse);
VerifyOrExit((message = NewMleMessage(kCommandDiscoveryResponse)) != nullptr, error = kErrorNoBufs);
message->SetPanId(aDiscoverRequestMessage.GetPanId());
#if OPENTHREAD_CONFIG_MULTI_RADIO
// Send the MLE Discovery Response message on same radio link
@@ -2970,8 +2965,6 @@ Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const M
message->SetRadioType(aDiscoverRequestMessage.GetRadioType());
#endif
SuccessOrExit(error = AppendHeader(*message, kCommandDiscoveryResponse));
// Discovery TLV
tlv.SetType(Tlv::kDiscovery);
SuccessOrExit(error = message->Append(tlv));
@@ -3057,8 +3050,7 @@ Error MleRouter::SendChildIdResponse(Child &aChild)
Ip6::Address destination;
Message * message;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildIdResponse));
VerifyOrExit((message = NewMleMessage(kCommandChildIdResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendActiveTimestamp(*message));
@@ -3171,9 +3163,7 @@ Error MleRouter::SendChildUpdateRequest(Child &aChild)
}
}
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildUpdateRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateRequest));
VerifyOrExit((message = NewMleMessage(kCommandChildUpdateRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendNetworkData(*message, aChild.GetNetworkDataType()));
@@ -3212,8 +3202,7 @@ void MleRouter::SendChildUpdateResponse(Child * aChild,
Error error = kErrorNone;
Message *message;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateResponse));
VerifyOrExit((message = NewMleMessage(kCommandChildUpdateResponse)) != nullptr, error = kErrorNoBufs);
for (int i = 0; i < aTlvsLength; i++)
{
@@ -3305,9 +3294,7 @@ void MleRouter::SendDataResponse(const Ip6::Address &aDestination,
ExitNow();
}
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDataResponse);
SuccessOrExit(error = AppendHeader(*message, kCommandDataResponse));
VerifyOrExit((message = NewMleMessage(kCommandDataResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendActiveTimestamp(*message));
@@ -4444,8 +4431,7 @@ Error MleRouter::SendTimeSync(void)
Ip6::Address destination;
Message * message = nullptr;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandTimeSync));
VerifyOrExit((message = NewMleMessage(kCommandTimeSync)) != nullptr, error = kErrorNoBufs);
message->SetTimeSync(true);