From c020f862301f31c83bbdfbe27031a8f4e4f4bd53 Mon Sep 17 00:00:00 2001 From: Yang Song Date: Tue, 3 Jun 2025 02:09:27 +0800 Subject: [PATCH] [posix] DNS resolver to handle link-local server address (#11548) When `sendto` is used with a Link-Local IPv6 destination, the index of the outgoing network interface must be included. --- src/posix/platform/resolver.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/posix/platform/resolver.cpp b/src/posix/platform/resolver.cpp index ffd74ec51..a9fcbe10d 100644 --- a/src/posix/platform/resolver.cpp +++ b/src/posix/platform/resolver.cpp @@ -231,8 +231,8 @@ otError Resolver::SendQueryToServer(Transaction *aTxn, { otError error = OT_ERROR_NONE; otIp4Address ip4Addr; - sockaddr_in serverAddr4; - sockaddr_in6 serverAddr6; + sockaddr_in serverAddr4 = {}; + sockaddr_in6 serverAddr6 = {}; if (otIp4FromIp4MappedIp6Address(&aServerAddress, &ip4Addr) == OT_ERROR_NONE) { @@ -249,6 +249,11 @@ otError Resolver::SendQueryToServer(Transaction *aTxn, memcpy(&serverAddr6.sin6_addr, &aServerAddress, sizeof(otIp6Address)); serverAddr6.sin6_family = AF_INET6; serverAddr6.sin6_port = htons(53); + if (IsIp6AddressLinkLocal(aServerAddress)) + { + // Network interface index is required for link local destinations + serverAddr6.sin6_scope_id = otSysGetInfraNetifIndex(); + } VerifyOrExit(sendto(aTxn->mUdpFd6, aPacket, aLength, MSG_DONTWAIT, reinterpret_cast(&serverAddr6), sizeof(serverAddr6)) > 0,