[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`.
diff --git a/src/core/thread/discover_scanner.cpp b/src/core/thread/discover_scanner.cpp
index f8db1c5..e652afe 100644
--- a/src/core/thread/discover_scanner.cpp
+++ b/src/core/thread/discover_scanner.cpp
@@ -105,10 +105,8 @@
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();
diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp
index b64f529..b5c18d6 100644
--- a/src/core/thread/mle.cpp
+++ b/src/core/thread/mle.cpp
@@ -1031,37 +1031,59 @@
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 @@
// 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 @@
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 @@
}
}
- 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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);
diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp
index 205b818..56c03d9 100644
--- a/src/core/thread/mle.hpp
+++ b/src/core/thread/mle.hpp
@@ -975,12 +975,14 @@
};
/**
- * 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.
@@ -1007,18 +1009,6 @@
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.
*
* @param[in] aMessage A reference to the message.
diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp
index 52e67a6..ff5892f 100644
--- a/src/core/thread/mle_router.cpp
+++ b/src/core/thread/mle_router.cpp
@@ -496,8 +496,7 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
- 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 @@
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 @@
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 @@
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);