diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp index 68236eb64126a8..9d80341d05bc1a 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp @@ -211,8 +211,11 @@ void GenericThreadStackManagerImpl_OpenThread_LwIP::UpdateThreadInter } } - // Set the address state to PREFERRED or ACTIVE depending on the state in OpenThread. - netif_ip6_addr_set_state(mNetIf, addrIdx, (otAddr->mPreferred) ? IP6_ADDR_PREFERRED : IP6_ADDR_VALID); + // Set non-mesh-local address state to PREFERRED or ACTIVE depending on the state in OpenThread. + netif_ip6_addr_set_state(mNetIf, addrIdx, + (otAddr->mPreferred && !IsOpenThreadMeshLocalAddress(Impl()->OTInstance(), addr)) + ? IP6_ADDR_PREFERRED + : IP6_ADDR_VALID); // Record that the netif address slot was assigned during this loop. addrAssigned[addrIdx] = true;