mirror of
https://github.com/espressif/openthread.git
synced 2026-09-25 18:37:40 +00:00
[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:
@@ -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
@@ -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
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user