From: Y7n05h Date: Thu, 26 May 2022 05:56:52 +0000 (+0800) Subject: dnsdist: refactor sendfromto X-Git-Tag: auth-4.8.0-alpha0~54^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F11651%2Fhead;p=thirdparty%2Fpdns.git dnsdist: refactor sendfromto Signed-off-by: Y7n05h --- diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 6e11a4c8ce..8ea5f3c228 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -154,6 +154,33 @@ std::set g_capabilitiesToRetain; static size_t const s_initialUDPPacketBufferSize = s_maxPacketCacheEntrySize + DNSCRYPT_MAX_RESPONSE_PADDING_AND_MAC_SIZE; static_assert(s_initialUDPPacketBufferSize <= UINT16_MAX, "Packet size should fit in a uint16_t"); +static ssize_t sendfromto(int sock, const void* data, size_t len, int flags, const ComboAddress& from, const ComboAddress& to) +{ + if (from.sin4.sin_family == 0) { + return sendto(sock, data, len, flags, reinterpret_cast(&to), to.getSocklen()); + } + struct msghdr msgh; + struct iovec iov; + cmsgbuf_aligned cbuf; + + /* Set up iov and msgh structures. */ + memset(&msgh, 0, sizeof(struct msghdr)); + iov.iov_base = const_cast(data); + iov.iov_len = len; + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + msgh.msg_name = (struct sockaddr*)&to; + msgh.msg_namelen = to.getSocklen(); + + if(from.sin4.sin_family) { + addCMsgSrcAddr(&msgh, &cbuf, &from, 0); + } + else { + msgh.msg_control=nullptr; + } + return sendmsg(sock, &msgh, flags); +} + static void truncateTC(PacketBuffer& packet, size_t maximumSize, unsigned int qnameWireLength) { try @@ -188,13 +215,7 @@ struct DelayedPacket ComboAddress origDest; void operator()() { - ssize_t res; - if(origDest.sin4.sin_family == 0) { - res = sendto(fd, packet.data(), packet.size(), 0, (struct sockaddr*)&destination, destination.getSocklen()); - } - else { - res = sendfromto(fd, packet.data(), packet.size(), 0, origDest, destination); - } + ssize_t res = sendfromto(fd, packet.data(), packet.size(), 0, origDest, destination); if (res == -1) { int err = errno; vinfolog("Error sending delayed response to %s: %s", destination.toStringWithPort(), strerror(err)); @@ -526,13 +547,7 @@ static bool sendUDPResponse(int origFD, const PacketBuffer& response, const int g_delay->submit(dp, delayMsec); } else { - ssize_t res; - if (origDest.sin4.sin_family == 0) { - res = sendto(origFD, response.data(), response.size(), 0, reinterpret_cast(&origRemote), origRemote.getSocklen()); - } - else { - res = sendfromto(origFD, response.data(), response.size(), 0, origDest, origRemote); - } + ssize_t res = sendfromto(origFD, response.data(), response.size(), 0, origDest, origRemote); if (res == -1) { int err = errno; vinfolog("Error sending response to %s: %s", origRemote.toStringWithPort(), stringerror(err)); diff --git a/pdns/iputils.cc b/pdns/iputils.cc index 42522bdeba..528ae90149 100644 --- a/pdns/iputils.cc +++ b/pdns/iputils.cc @@ -295,30 +295,6 @@ int sendOnNBSocket(int fd, const struct msghdr *msgh) return sendErr; } -ssize_t sendfromto(int sock, const void* data, size_t len, int flags, const ComboAddress& from, const ComboAddress& to) -{ - struct msghdr msgh; - struct iovec iov; - cmsgbuf_aligned cbuf; - - /* Set up iov and msgh structures. */ - memset(&msgh, 0, sizeof(struct msghdr)); - iov.iov_base = const_cast(data); - iov.iov_len = len; - msgh.msg_iov = &iov; - msgh.msg_iovlen = 1; - msgh.msg_name = (struct sockaddr*)&to; - msgh.msg_namelen = to.getSocklen(); - - if(from.sin4.sin_family) { - addCMsgSrcAddr(&msgh, &cbuf, &from, 0); - } - else { - msgh.msg_control=nullptr; - } - return sendmsg(sock, &msgh, flags); -} - // be careful: when using this for receive purposes, make sure addr->sin4.sin_family is set appropriately so getSocklen works! // be careful: when using this function for *send* purposes, be sure to set cbufsize to 0! // be careful: if you don't call addCMsgSrcAddr after fillMSGHdr, make sure to set msg_control to NULL diff --git a/pdns/iputils.hh b/pdns/iputils.hh index 311d9f17e5..2049bc35bc 100644 --- a/pdns/iputils.hh +++ b/pdns/iputils.hh @@ -1681,7 +1681,6 @@ bool HarvestDestinationAddress(const struct msghdr* msgh, ComboAddress* destinat bool HarvestTimestamp(struct msghdr* msgh, struct timeval* tv); void fillMSGHdr(struct msghdr* msgh, struct iovec* iov, cmsgbuf_aligned* cbuf, size_t cbufsize, char* data, size_t datalen, ComboAddress* addr); int sendOnNBSocket(int fd, const struct msghdr *msgh); -ssize_t sendfromto(int sock, const void* data, size_t len, int flags, const ComboAddress& from, const ComboAddress& to); size_t sendMsgWithOptions(int fd, const char* buffer, size_t len, const ComboAddress* dest, const ComboAddress* local, unsigned int localItf, int flags); /* requires a non-blocking, connected TCP socket */