diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index af7c9ab97..294e9d56f 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3132,49 +3132,35 @@ bool MleRouter::IsMinimalChild(uint16_t aRloc16) void MleRouter::RemoveNeighbor(Neighbor &aNeighbor) { - switch (mRole) + if (&aNeighbor == &mParent) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: - break; - - case OT_DEVICE_ROLE_CHILD: - if (&aNeighbor == &mParent) + if (mRole == OT_DEVICE_ROLE_CHILD) { BecomeDetached(); } - - break; - - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: - if (!IsActiveRouter(aNeighbor.GetRloc16())) + } + else if (!IsActiveRouter(aNeighbor.GetRloc16())) + { + if (aNeighbor.IsStateValidOrRestoring()) { - if (aNeighbor.IsStateValidOrRestoring()) - { - Signal(OT_NEIGHBOR_TABLE_EVENT_CHILD_REMOVED, aNeighbor); - } - - aNeighbor.SetState(Neighbor::kStateInvalid); - - Get().ClearAllMessagesForSleepyChild(static_cast(aNeighbor)); - Get().SendServerDataNotification(aNeighbor.GetRloc16()); - - if (aNeighbor.IsFullThreadDevice()) - { - // Clear all EID-to-RLOC entries associated with the child. - Get().Remove(aNeighbor.GetRloc16()); - } - - RemoveStoredChild(aNeighbor.GetRloc16()); - } - else if (aNeighbor.IsStateValid()) - { - Signal(OT_NEIGHBOR_TABLE_EVENT_ROUTER_REMOVED, aNeighbor); - mRouterTable.RemoveNeighbor(static_cast(aNeighbor)); + Signal(OT_NEIGHBOR_TABLE_EVENT_CHILD_REMOVED, aNeighbor); } - break; + Get().ClearAllMessagesForSleepyChild(static_cast(aNeighbor)); + Get().SendServerDataNotification(aNeighbor.GetRloc16()); + + if (aNeighbor.IsFullThreadDevice()) + { + // Clear all EID-to-RLOC entries associated with the child. + Get().Remove(aNeighbor.GetRloc16()); + } + + RemoveStoredChild(aNeighbor.GetRloc16()); + } + else if (aNeighbor.IsStateValid()) + { + Signal(OT_NEIGHBOR_TABLE_EVENT_ROUTER_REMOVED, aNeighbor); + mRouterTable.RemoveNeighbor(static_cast(aNeighbor)); } aNeighbor.GetLinkInfo().Clear();