[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); mScanChannels.Intersect(aScanChannels);
} }
VerifyOrExit((message = Get<Mle>().NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = Get<Mle>().NewMleMessage(Mle::kCommandDiscoveryRequest)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDiscoverRequest);
message->SetPanId(aPanId); message->SetPanId(aPanId);
SuccessOrExit(error = Get<Mle>().AppendHeader(*message, Mle::kCommandDiscoveryRequest));
// Prepare sub-TLV MeshCoP Discovery Request. // Prepare sub-TLV MeshCoP Discovery Request.
discoveryRequest.Init(); discoveryRequest.Init();
+49 -39
View File
@@ -1031,37 +1031,59 @@ const LeaderData &Mle::GetLeaderData(void)
return mLeaderData; return mLeaderData;
} }
Message *Mle::NewMleMessage(void) Message *Mle::NewMleMessage(Command aCommand)
{ {
Error error = kErrorNone;
Message * message; Message * message;
Message::Settings settings(Message::kNoLinkSecurity, Message::kPriorityNet); Message::Settings settings(Message::kNoLinkSecurity, Message::kPriorityNet);
Message::SubType subType;
uint8_t securitySuite;
message = mSocket.NewMessage(0, settings); message = mSocket.NewMessage(0, settings);
VerifyOrExit(message != nullptr); VerifyOrExit(message != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleGeneral); securitySuite = k154Security;
subType = Message::kSubTypeMleGeneral;
exit:
return message;
}
Error Mle::AppendHeader(Message &aMessage, Command aCommand)
{
Error error = kErrorNone;
uint8_t securitySuite = k154Security;
switch (aCommand) switch (aCommand)
{ {
case kCommandAnnounce:
subType = Message::kSubTypeMleAnnounce;
break;
case kCommandDiscoveryRequest: case kCommandDiscoveryRequest:
case kCommandDiscoveryResponse: subType = Message::kSubTypeMleDiscoverRequest;
securitySuite = kNoSecurity; securitySuite = kNoSecurity;
break; 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: default:
break; break;
} }
SuccessOrExit(error = aMessage.Append(securitySuite)); message->SetSubType(subType);
SuccessOrExit(error = message->Append(securitySuite));
if (securitySuite == k154Security) if (securitySuite == k154Security)
{ {
@@ -1071,13 +1093,14 @@ Error Mle::AppendHeader(Message &aMessage, Command aCommand)
// message in `SendMessage()` before message is sent. // message in `SendMessage()` before message is sent.
securityHeader.InitSecurityControl(); 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: exit:
return error; FreeAndNullMessageOnError(message, error);
return message;
} }
Error Mle::AppendSourceAddress(Message &aMessage) const Error Mle::AppendSourceAddress(Message &aMessage) const
@@ -2117,8 +2140,7 @@ void Mle::SendParentRequest(ParentRequestType aType)
break; break;
} }
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandParentRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandParentRequest));
SuccessOrExit(error = AppendMode(*message, mDeviceMode)); SuccessOrExit(error = AppendMode(*message, mDeviceMode));
SuccessOrExit(error = AppendChallenge(*message, mParentRequestChallenge)); SuccessOrExit(error = AppendChallenge(*message, mParentRequestChallenge));
SuccessOrExit(error = AppendScanMask(*message, scanMask)); SuccessOrExit(error = AppendScanMask(*message, scanMask));
@@ -2180,9 +2202,7 @@ Error Mle::SendChildIdRequest(void)
} }
} }
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildIdRequest)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildIdRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildIdRequest));
SuccessOrExit(error = AppendResponse(*message, mParentCandidateChallenge)); SuccessOrExit(error = AppendResponse(*message, mParentCandidateChallenge));
SuccessOrExit(error = AppendLinkFrameCounter(*message)); SuccessOrExit(error = AppendLinkFrameCounter(*message));
SuccessOrExit(error = AppendMleFrameCounter(*message)); SuccessOrExit(error = AppendMleFrameCounter(*message));
@@ -2234,9 +2254,7 @@ Error Mle::SendDataRequest(const Ip6::Address &aDestination,
RemoveDelayedDataRequestMessage(aDestination); RemoveDelayedDataRequestMessage(aDestination);
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandDataRequest)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDataRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandDataRequest));
SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength)); SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength));
if (aExtraTlvs != nullptr && aExtraTlvsLength > 0) if (aExtraTlvs != nullptr && aExtraTlvsLength > 0)
@@ -2419,9 +2437,7 @@ Error Mle::SendChildUpdateRequest(void)
mChildUpdateRequestState = kChildUpdateRequestActive; mChildUpdateRequestState = kChildUpdateRequestActive;
ScheduleMessageTransmissionTimer(); ScheduleMessageTransmissionTimer();
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildUpdateRequest)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildUpdateRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateRequest));
SuccessOrExit(error = AppendMode(*message, mDeviceMode)); SuccessOrExit(error = AppendMode(*message, mDeviceMode));
switch (mRole) switch (mRole)
@@ -2488,8 +2504,7 @@ Error Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, const
Message * message; Message * message;
bool checkAddress = false; bool checkAddress = false;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildUpdateResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateResponse));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
@@ -2574,11 +2589,9 @@ void Mle::SendAnnounce(uint8_t aChannel, const Ip6::Address &aDestination, Annou
Message * message = nullptr; Message * message = nullptr;
VerifyOrExit(Get<Mac::Mac>().GetSupportedChannelMask().ContainsChannel(aChannel), error = kErrorInvalidArgs); 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->SetLinkSecurityEnabled(true);
message->SetSubType(Message::kSubTypeMleAnnounce);
message->SetChannel(aChannel); message->SetChannel(aChannel);
SuccessOrExit(error = AppendHeader(*message, kCommandAnnounce));
channel.Init(); channel.Init();
channel.SetChannelPage(0); channel.SetChannelPage(0);
@@ -2639,8 +2652,7 @@ Error Mle::SendLinkMetricsManagementResponse(const Ip6::Address &aDestination, L
Tlv tlv; Tlv tlv;
ot::Tlv statusSubTlv; ot::Tlv statusSubTlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandLinkMetricsManagementResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkMetricsManagementResponse));
tlv.SetType(Tlv::kLinkMetricsManagement); tlv.SetType(Tlv::kLinkMetricsManagement);
statusSubTlv.SetType(LinkMetrics::SubTlv::kStatus); statusSubTlv.SetType(LinkMetrics::SubTlv::kStatus);
@@ -2666,8 +2678,7 @@ Error Mle::SendLinkProbe(const Ip6::Address &aDestination, uint8_t aSeriesId, ui
Message *message; Message *message;
Tlv tlv; Tlv tlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandLinkProbe)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkProbe));
tlv.SetType(Tlv::kLinkProbe); tlv.SetType(Tlv::kLinkProbe);
tlv.SetLength(sizeof(aSeriesId) + aLength); tlv.SetLength(sizeof(aSeriesId) + aLength);
@@ -4666,8 +4677,7 @@ Error Mle::SendLinkMetricsManagementRequest(const Ip6::Address &aDestination, co
Message *message; Message *message;
Tlv tlv; Tlv tlv;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandLinkMetricsManagementRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkMetricsManagementRequest));
// Link Metrics Management TLV // Link Metrics Management TLV
tlv.SetType(Tlv::kLinkMetricsManagement); 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. * @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. * This method sets the device role.
@@ -1006,18 +1008,6 @@ protected:
*/ */
void SetAttachState(AttachState aState); 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. * 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. // children to detach.
VerifyOrExit(!mAddressSolicitPending); VerifyOrExit(!mAddressSolicitPending);
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandAdvertisement)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandAdvertisement));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
@@ -538,8 +537,7 @@ Error MleRouter::SendLinkRequest(Neighbor *aNeighbor)
destination.Clear(); destination.Clear();
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandLinkRequest)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandLinkRequest));
SuccessOrExit(error = AppendVersion(*message)); SuccessOrExit(error = AppendVersion(*message));
switch (mRole) switch (mRole)
@@ -735,8 +733,7 @@ Error MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo,
command = (aNeighbor == nullptr || aNeighbor->IsStateValid()) ? kCommandLinkAccept : kCommandLinkAcceptAndRequest; command = (aNeighbor == nullptr || aNeighbor->IsStateValid()) ? kCommandLinkAccept : kCommandLinkAcceptAndRequest;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(command)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, command));
SuccessOrExit(error = AppendVersion(*message)); SuccessOrExit(error = AppendVersion(*message));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendResponse(*message, aChallenge)); SuccessOrExit(error = AppendResponse(*message, aChallenge));
@@ -1954,10 +1951,9 @@ void MleRouter::SendParentResponse(Child *aChild, const Challenge &aChallenge, b
Message * message; Message * message;
uint16_t delay; uint16_t delay;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandParentResponse)) != nullptr, error = kErrorNoBufs);
message->SetDirectTransmission(); message->SetDirectTransmission();
SuccessOrExit(error = AppendHeader(*message, kCommandParentResponse));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendLinkFrameCounter(*message)); SuccessOrExit(error = AppendLinkFrameCounter(*message));
@@ -2961,8 +2957,7 @@ Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const M
MeshCoP::NetworkNameTlv networkName; MeshCoP::NetworkNameTlv networkName;
uint16_t delay; uint16_t delay;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandDiscoveryResponse)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDiscoverResponse);
message->SetPanId(aDiscoverRequestMessage.GetPanId()); message->SetPanId(aDiscoverRequestMessage.GetPanId());
#if OPENTHREAD_CONFIG_MULTI_RADIO #if OPENTHREAD_CONFIG_MULTI_RADIO
// Send the MLE Discovery Response message on same radio link // 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()); message->SetRadioType(aDiscoverRequestMessage.GetRadioType());
#endif #endif
SuccessOrExit(error = AppendHeader(*message, kCommandDiscoveryResponse));
// Discovery TLV // Discovery TLV
tlv.SetType(Tlv::kDiscovery); tlv.SetType(Tlv::kDiscovery);
SuccessOrExit(error = message->Append(tlv)); SuccessOrExit(error = message->Append(tlv));
@@ -3057,8 +3050,7 @@ Error MleRouter::SendChildIdResponse(Child &aChild)
Ip6::Address destination; Ip6::Address destination;
Message * message; Message * message;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildIdResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildIdResponse));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendActiveTimestamp(*message)); SuccessOrExit(error = AppendActiveTimestamp(*message));
@@ -3171,9 +3163,7 @@ Error MleRouter::SendChildUpdateRequest(Child &aChild)
} }
} }
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildUpdateRequest)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleChildUpdateRequest);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateRequest));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendNetworkData(*message, aChild.GetNetworkDataType())); SuccessOrExit(error = AppendNetworkData(*message, aChild.GetNetworkDataType()));
@@ -3212,8 +3202,7 @@ void MleRouter::SendChildUpdateResponse(Child * aChild,
Error error = kErrorNone; Error error = kErrorNone;
Message *message; Message *message;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandChildUpdateResponse)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandChildUpdateResponse));
for (int i = 0; i < aTlvsLength; i++) for (int i = 0; i < aTlvsLength; i++)
{ {
@@ -3305,9 +3294,7 @@ void MleRouter::SendDataResponse(const Ip6::Address &aDestination,
ExitNow(); ExitNow();
} }
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandDataResponse)) != nullptr, error = kErrorNoBufs);
message->SetSubType(Message::kSubTypeMleDataResponse);
SuccessOrExit(error = AppendHeader(*message, kCommandDataResponse));
SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendActiveTimestamp(*message)); SuccessOrExit(error = AppendActiveTimestamp(*message));
@@ -4444,8 +4431,7 @@ Error MleRouter::SendTimeSync(void)
Ip6::Address destination; Ip6::Address destination;
Message * message = nullptr; Message * message = nullptr;
VerifyOrExit((message = NewMleMessage()) != nullptr, error = kErrorNoBufs); VerifyOrExit((message = NewMleMessage(kCommandTimeSync)) != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = AppendHeader(*message, kCommandTimeSync));
message->SetTimeSync(true); message->SetTimeSync(true);