From: Miroslav Lichvar Date: Tue, 30 Jun 2020 13:26:55 +0000 (+0200) Subject: socket: add support for selecting interface again X-Git-Tag: 4.0-pre3~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99e3c67a8104864300cebf58fdf6a7cece99c8c2;p=thirdparty%2Fchrony.git socket: add support for selecting interface again Revert commit e49aececceaa ("socket: don't set interface for sent packets") to allow the interface to be selected for outgoing packets, but don't set it in the callers yet. --- diff --git a/cmdmon.c b/cmdmon.c index 1ade2062..37dc9449 100644 --- a/cmdmon.c +++ b/cmdmon.c @@ -301,6 +301,9 @@ transmit_reply(int sock_fd, SCK_Message *message) { message->length = PKL_ReplyLength((CMD_Reply *)message->data); + /* Don't require the response to use the same interface */ + message->if_index = INVALID_IF_INDEX; + if (!SCK_SendMessage(sock_fd, message, 0)) return; } diff --git a/ntp_io.c b/ntp_io.c index 1ba5efb0..58b22243 100644 --- a/ntp_io.c +++ b/ntp_io.c @@ -452,9 +452,11 @@ NIO_SendPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr, message.remote_addr.ip.port = remote_addr->port; } - message.if_index = local_addr->if_index; message.local_addr.ip = local_addr->ip_addr; + /* Don't require the response to use the same interface */ + message.if_index = INVALID_IF_INDEX; + #if !defined(HAVE_IN_PKTINFO) && defined(IP_SENDSRCADDR) /* On FreeBSD a local IPv4 address cannot be specified on bound socket */ if (message.local_addr.ip.family == IPADDR_INET4 && diff --git a/socket.c b/socket.c index 9eaf9fda..dbcf6240 100644 --- a/socket.c +++ b/socket.c @@ -1049,6 +1049,8 @@ send_message(int sock_fd, SCK_Message *message, int flags) return 0; ipi->ipi_spec_dst.s_addr = htonl(message->local_addr.ip.addr.in4); + if (message->if_index != INVALID_IF_INDEX) + ipi->ipi_ifindex = message->if_index; #elif defined(IP_SENDSRCADDR) struct in_addr *addr; @@ -1073,6 +1075,8 @@ send_message(int sock_fd, SCK_Message *message, int flags) memcpy(&ipi->ipi6_addr.s6_addr, &message->local_addr.ip.addr.in6, sizeof(ipi->ipi6_addr.s6_addr)); + if (message->if_index != INVALID_IF_INDEX) + ipi->ipi6_ifindex = message->if_index; } #endif }