[mle] add AppendSourceAddressAndLeaderDataTlvs() helper (#12867)

This commit introduces `TxMessage::AppendSourceAddressAndLeaderDataTlvs()`
to consolidate the appending of `Source Address` and `Leader Data` TLVs.

This combination is frequently used together across various MLE messages
to provide the sender's identity and leader data. Centralizing this
into a single helper method improves code consistency.

Additionally, the `TxMessage` methods in `mle.hpp` and `mle.cpp` are
organized into "Appending single TLV" and "Appending multiple TLVs"
sections for better clarity and maintainability. Existing multi-TLV
methods like `AppendLinkAndMleFrameCounterTlvs()` and
`AppendActiveAndPendingTimestampTlvs()` are moved to the new section.
This commit is contained in:
Abtin Keshavarzian
2026-04-10 21:37:24 -05:00
committed by GitHub
parent a98813b30a
commit 9feec93a20
3 changed files with 56 additions and 40 deletions
+43 -24
View File
@@ -1261,8 +1261,7 @@ Error Mle::SendChildUpdateRequestToParent(ChildUpdateRequestMode aMode)
break;
case kRoleChild:
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
SuccessOrExit(error = message->AppendTimeoutTlv((aMode == kAppendZeroTimeout) ? 0 : mTimeout));
SuccessOrExit(error = message->AppendSupervisionIntervalTlvIfSleepyChild());
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
@@ -3545,6 +3544,9 @@ exit:
return message;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// TxMessage - Append single TLV
Error Mle::TxMessage::AppendSourceAddressTlv(void)
{
return Tlv::Append<SourceAddressTlv>(*this, Get<Mle>().GetRloc16());
@@ -3589,17 +3591,6 @@ Error Mle::TxMessage::AppendMleFrameCounterTlv(void)
return Tlv::Append<MleFrameCounterTlv>(*this, Get<KeyManager>().GetMleFrameCounter());
}
Error Mle::TxMessage::AppendLinkAndMleFrameCounterTlvs(void)
{
Error error;
SuccessOrExit(error = AppendLinkFrameCounterTlv());
error = AppendMleFrameCounterTlv();
exit:
return error;
}
Error Mle::TxMessage::AppendAddress16Tlv(uint16_t aRloc16) { return Tlv::Append<Address16Tlv>(*this, aRloc16); }
Error Mle::TxMessage::AppendLeaderDataTlv(void)
@@ -3827,17 +3818,6 @@ exit:
return error;
}
Error Mle::TxMessage::AppendActiveAndPendingTimestampTlvs(void)
{
Error error;
SuccessOrExit(error = AppendActiveTimestampTlv());
error = AppendPendingTimestampTlv();
exit:
return error;
}
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
Error Mle::TxMessage::AppendCslChannelTlv(void)
{
@@ -3873,6 +3853,45 @@ Error Mle::TxMessage::AppendCslClockAccuracyTlv(void)
}
#endif
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// TxMessage - Append multiple TLVs
Error Mle::TxMessage::AppendLinkAndMleFrameCounterTlvs(void)
{
Error error;
SuccessOrExit(error = AppendLinkFrameCounterTlv());
error = AppendMleFrameCounterTlv();
exit:
return error;
}
Error Mle::TxMessage::AppendSourceAddressAndLeaderDataTlvs(void)
{
Error error;
SuccessOrExit(error = AppendSourceAddressTlv());
error = AppendLeaderDataTlv();
exit:
return error;
}
Error Mle::TxMessage::AppendActiveAndPendingTimestampTlvs(void)
{
Error error;
SuccessOrExit(error = AppendActiveTimestampTlv());
error = AppendPendingTimestampTlv();
exit:
return error;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// TxMessage - Misc
Error Mle::TxMessage::SendTo(const Ip6::Address &aDestination)
{
Error error = kErrorNone;
+6 -2
View File
@@ -1556,6 +1556,7 @@ private:
class TxMessage : public Message
{
public:
// Appending single TLV
Error AppendSourceAddressTlv(void);
Error AppendModeTlv(DeviceMode aMode);
Error AppendTimeoutTlv(uint32_t aTimeout);
@@ -1563,7 +1564,6 @@ private:
Error AppendResponseTlv(const RxChallenge &aResponse);
Error AppendLinkFrameCounterTlv(void);
Error AppendMleFrameCounterTlv(void);
Error AppendLinkAndMleFrameCounterTlvs(void);
Error AppendAddress16Tlv(uint16_t aRloc16);
Error AppendNetworkDataTlv(NetworkData::Type aType);
Error AppendTlvRequestTlv(const uint8_t *aTlvs, uint8_t aTlvsLength);
@@ -1578,7 +1578,6 @@ private:
Error AppendXtalAccuracyTlv(void);
Error AppendActiveTimestampTlv(void);
Error AppendPendingTimestampTlv(void);
Error AppendActiveAndPendingTimestampTlvs(void);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
Error AppendTimeRequestTlv(void);
Error AppendTimeParameterTlv(void);
@@ -1603,6 +1602,11 @@ private:
return AppendTlvRequestTlv(aTlvArray, kArrayLength);
}
// Appending multiple TLVs
Error AppendLinkAndMleFrameCounterTlvs(void);
Error AppendSourceAddressAndLeaderDataTlvs(void);
Error AppendActiveAndPendingTimestampTlvs(void);
Error SendTo(const Ip6::Address &aDestination);
private:
+7 -14
View File
@@ -539,8 +539,7 @@ void Mle::SendAdvertisement(const Ip6::Address &aDestination)
VerifyOrExit(!mAddressSolicitPending);
VerifyOrExit((message = NewMleMessage(kCommandAdvertisement)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
switch (mRole)
{
@@ -588,8 +587,7 @@ void Mle::SendLinkRequest(Router *aRouter)
break;
case kRoleChild:
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
break;
case kRoleRouter:
@@ -603,8 +601,7 @@ void Mle::SendLinkRequest(Router *aRouter)
SuccessOrExit(error = message->AppendTlvRequestTlv(kValidNeighborTlvs));
}
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
break;
case kRoleDisabled:
@@ -1800,8 +1797,7 @@ void Mle::SendParentResponse(const ParentResponseInfo &aInfo)
VerifyOrExit((message = NewMleMessage(kCommandParentResponse)) != nullptr, error = kErrorNoBufs);
message->SetDirectTransmission();
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
SuccessOrExit(error = message->AppendLinkAndMleFrameCounterTlvs());
SuccessOrExit(error = message->AppendResponseTlv(aInfo.mRxChallenge));
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
@@ -2886,8 +2882,7 @@ Error Mle::SendChildIdResponse(Child &aChild)
TxMessage *message;
VerifyOrExit((message = NewMleMessage(kCommandChildIdResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
SuccessOrExit(error = message->AppendActiveAndPendingTimestampTlvs());
if ((aChild.GetRloc16() == 0) || !HasMatchingRouterIdWith(aChild.GetRloc16()))
@@ -2975,8 +2970,7 @@ Error Mle::SendChildUpdateRequestToChild(Child &aChild)
Get<MeshForwarder>().RemoveMessagesForChild(aChild, IsMessageChildUpdateRequest);
VerifyOrExit((message = NewMleMessage(kCommandChildUpdateRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
SuccessOrExit(error = message->AppendNetworkDataTlv(aChild.GetNetworkDataType()));
SuccessOrExit(error = message->AppendActiveAndPendingTimestampTlvs());
@@ -3148,8 +3142,7 @@ void Mle::SendDataResponse(const Ip6::Address &aDestination, const TlvList &aTlv
}
VerifyOrExit((message = NewMleMessage(kCommandDataResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = message->AppendSourceAddressTlv());
SuccessOrExit(error = message->AppendLeaderDataTlv());
SuccessOrExit(error = message->AppendSourceAddressAndLeaderDataTlvs());
SuccessOrExit(error = message->AppendActiveAndPendingTimestampTlvs());
for (uint8_t tlvType : aTlvList)