diff --git a/CHANGES b/CHANGES index 903553e6c7..8fca0a9e12 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,11 @@ +1247. [bug] Don't reset the interface index for link/site local + addresses. [RT #2576] + +1246. [func] New functions isc_sockaddr_issitelocal(), + isc_sockaddr_islinklocal(), isc_netaddr_issitelocal() + and isc_netaddr_islinklocal(). + + 1235. [func] Report 'out of memory' errors from openssl. 1233. [bug] The flags field of a KEY record can be expressed in @@ -711,10 +719,6 @@ 1248. [bug] DESTDIR was not being propagated between makes. -1246. [func] New functions isc_sockaddr_issitelocal(), - isc_sockaddr_islinklocal(), isc_netaddr_issitelocal() - and isc_netaddr_islinklocal(). - 1245. [bug] Treat ENOBUFS, ENOMEM and ENFILE as soft errors for accept(). diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 8685321344..06d451ff4d 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.207.2.19.2.1 2003/08/08 06:50:17 marka Exp $ */ +/* $Id: socket.c,v 1.207.2.19.2.2 2003/08/14 04:31:55 marka Exp $ */ #include @@ -2599,18 +2599,22 @@ socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task, set_dev_address(address, sock, dev); if (pktinfo != NULL) { - socket_log(sock, NULL, TRACE, isc_msgcat, ISC_MSGSET_SOCKET, - ISC_MSG_PKTINFOPROVIDED, - "pktinfo structure provided, ifindex %u (set to 0)", - pktinfo->ipi6_ifindex); - dev->attributes |= ISC_SOCKEVENTATTR_PKTINFO; dev->pktinfo = *pktinfo; - /* - * Set the pktinfo index to 0 here, to let the kernel decide - * what interface it should send on. - */ - dev->pktinfo.ipi6_ifindex = 0; + + if (!isc_sockaddr_issitelocal(address) && + !isc_sockaddr_islinklocal(address)) { + socket_log(sock, NULL, TRACE, isc_msgcat, + ISC_MSGSET_SOCKET, ISC_MSG_PKTINFOPROVIDED, + "pktinfo structure provided, ifindex %u " + "(set to 0)", pktinfo->ipi6_ifindex); + + /* + * Set the pktinfo index to 0 here, to let the + * kernel decide what interface it should send on. + */ + dev->pktinfo.ipi6_ifindex = 0; + } } if (sock->type == isc_sockettype_udp)