diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index bc7e19ca3..5bfcb6ccf 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3657,8 +3657,7 @@ Error MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus) messageInfo.SetSockAddr(GetMeshLocal16()); messageInfo.SetPeerPort(Tmf::kUdpPort); - SuccessOrExit( - error = Get().SendMessage(*message, messageInfo, &MleRouter::HandleAddressSolicitResponse, this)); + SuccessOrExit(error = Get().SendMessage(*message, messageInfo, &HandleAddressSolicitResponse, this)); mAddressSolicitPending = true; Log(kMessageSend, kTypeAddressSolicit, messageInfo.GetPeerAddr()); @@ -3717,7 +3716,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Message * aMessage, mAddressSolicitPending = false; - VerifyOrExit(aResult == kErrorNone && aMessage != nullptr && aMessage != nullptr); + VerifyOrExit(aResult == kErrorNone && aMessage != nullptr && aMessageInfo != nullptr); VerifyOrExit(aMessage->GetCode() == Coap::kCodeChanged); @@ -3780,18 +3779,15 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Message * aMessage, leader->SetNextHop(RouterIdFromRloc16(mParent.GetRloc16())); } - // send link request IgnoreError(SendLinkRequest(nullptr)); - // send child id responses for (Child &child : Get().Iterate(Child::kInStateChildIdRequest)) { IgnoreError(SendChildIdResponse(child)); } exit: - - // send announce after received address solicit reply if needed + // Send announce after received address solicit reply if needed InformPreviousChannel(); } @@ -3816,9 +3812,6 @@ void MleRouter::HandleAddressSolicit(Coap::Message &aMessage, const Ip6::Message uint16_t rloc16; uint8_t status; Router * router = nullptr; -#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - uint16_t xtalAccuracy; -#endif VerifyOrExit(aMessage.IsConfirmablePostRequest(), error = kErrorParse); @@ -3828,20 +3821,18 @@ void MleRouter::HandleAddressSolicit(Coap::Message &aMessage, const Ip6::Message SuccessOrExit(error = Tlv::Find(aMessage, status)); #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - // In a time sync enabled network, all routers' xtal accuracy must be less than the threshold. - SuccessOrExit(Tlv::Find(aMessage, xtalAccuracy)); - VerifyOrExit(xtalAccuracy <= Get().GetXtalThreshold()); + { + uint16_t xtalAccuracy; + + SuccessOrExit(Tlv::Find(aMessage, xtalAccuracy)); + VerifyOrExit(xtalAccuracy <= Get().GetXtalThreshold()); + } #endif - // see if allocation already exists + // Check if allocation already exists router = mRouterTable.GetRouter(extAddress); + VerifyOrExit(router == nullptr); - if (router != nullptr) - { - ExitNow(); - } - - // check the request reason switch (status) { case ThreadStatusTlv::kTooFewRouters: @@ -3854,41 +3845,39 @@ void MleRouter::HandleAddressSolicit(Coap::Message &aMessage, const Ip6::Message default: ExitNow(error = kErrorParse); - OT_UNREACHABLE_CODE(break); } switch (Tlv::Find(aMessage, rloc16)) { case kErrorNone: router = mRouterTable.Allocate(RouterIdFromRloc16(rloc16)); - break; + + if (router != nullptr) + { + LogInfo("Router id %d requested and provided!", RouterIdFromRloc16(rloc16)); + break; + } + + OT_FALL_THROUGH; + case kErrorNotFound: + router = mRouterTable.Allocate(); break; + default: ExitNow(error = kErrorParse); } - // allocate new router id - if (router == nullptr) - { - router = mRouterTable.Allocate(); - } - else - { - LogInfo("router id requested and provided!"); - } - if (router != nullptr) { router->SetExtAddress(extAddress); } else { - LogInfo("router address unavailable!"); + LogInfo("Router address unavailable!"); } exit: - if (error == kErrorNone) { SendAddressSolicitResponse(aMessage, router, aMessageInfo); @@ -3899,35 +3888,37 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Message & aRequest, const Router * aRouter, const Ip6::MessageInfo &aMessageInfo) { - Error error = kErrorNone; - ThreadRouterMaskTlv routerMaskTlv; - Coap::Message * message; + Coap::Message * message = Get().NewPriorityMessage(); + ThreadStatusTlv::Status status; - VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); + VerifyOrExit(message != nullptr); - SuccessOrExit(error = message->SetDefaultResponseHeader(aRequest)); - SuccessOrExit(error = message->SetPayloadMarker()); + SuccessOrExit(message->SetDefaultResponseHeader(aRequest)); + SuccessOrExit(message->SetPayloadMarker()); - SuccessOrExit(error = Tlv::Append( - *message, aRouter == nullptr ? ThreadStatusTlv::kNoAddressAvailable : ThreadStatusTlv::kSuccess)); + status = (aRouter == nullptr) ? ThreadStatusTlv::kNoAddressAvailable : ThreadStatusTlv::kSuccess; + SuccessOrExit(Tlv::Append(*message, status)); if (aRouter != nullptr) { - SuccessOrExit(error = Tlv::Append(*message, aRouter->GetRloc16())); + ThreadRouterMaskTlv routerMaskTlv; + + SuccessOrExit(Tlv::Append(*message, aRouter->GetRloc16())); routerMaskTlv.Init(); routerMaskTlv.SetIdSequence(mRouterTable.GetRouterIdSequence()); routerMaskTlv.SetAssignedRouterIdMask(mRouterTable.GetRouterIdSet()); - SuccessOrExit(error = routerMaskTlv.AppendTo(*message)); + SuccessOrExit(routerMaskTlv.AppendTo(*message)); } - SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); + SuccessOrExit(Get().SendMessage(*message, aMessageInfo)); + message = nullptr; Log(kMessageSend, kTypeAddressReply, aMessageInfo.GetPeerAddr()); exit: - FreeMessageOnError(message, error); + FreeMessage(message); } void MleRouter::HandleAddressRelease(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)