diff --git a/src/core/thread/discover_scanner.cpp b/src/core/thread/discover_scanner.cpp index f8db1c574..e652afe58 100644 --- a/src/core/thread/discover_scanner.cpp +++ b/src/core/thread/discover_scanner.cpp @@ -105,10 +105,8 @@ Error DiscoverScanner::Discover(const Mac::ChannelMask &aScanChannels, mScanChannels.Intersect(aScanChannels); } - VerifyOrExit((message = Get().NewMleMessage()) != nullptr, error = kErrorNoBufs); - message->SetSubType(Message::kSubTypeMleDiscoverRequest); + VerifyOrExit((message = Get().NewMleMessage(Mle::kCommandDiscoveryRequest)) != nullptr, error = kErrorNoBufs); message->SetPanId(aPanId); - SuccessOrExit(error = Get().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 b64f529c3..b5c18d63c 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -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(aCommand); + error = message->Append(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().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); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 205b81891..56c03d91b 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -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. * diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 52e67a685..ff5892f90 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -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);