Module Name: src Committed By: mlelstv Date: Fri Apr 7 06:44:08 UTC 2023
Modified Files: src/sys/netinet: ip_carp.c Log Message: Select virtual address as sender if backing interface is anonymous. Use correct scope for IPv6. To generate a diff of this commit: cvs rdiff -u -r1.118 -r1.119 src/sys/netinet/ip_carp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/ip_carp.c diff -u src/sys/netinet/ip_carp.c:1.118 src/sys/netinet/ip_carp.c:1.119 --- src/sys/netinet/ip_carp.c:1.118 Sun Mar 26 10:32:38 2023 +++ src/sys/netinet/ip_carp.c Fri Apr 7 06:44:08 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_carp.c,v 1.118 2023/03/26 10:32:38 mlelstv Exp $ */ +/* $NetBSD: ip_carp.c,v 1.119 2023/04/07 06:44:08 mlelstv Exp $ */ /* $OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $ */ /* @@ -33,7 +33,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.118 2023/03/26 10:32:38 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.119 2023/04/07 06:44:08 mlelstv Exp $"); /* * TODO: @@ -1091,6 +1091,8 @@ carp_send_ad(void *v) _s = pserialize_read_enter(); ifa = ifaof_ifpforaddr(&sa, sc->sc_carpdev); if (ifa == NULL) + ifa = ifaof_ifpforaddr(&sa, &sc->sc_if); + if (ifa == NULL) ip->ip_src.s_addr = 0; else ip->ip_src.s_addr = @@ -1142,6 +1144,7 @@ carp_send_ad(void *v) if (sc->sc_naddrs6) { struct ip6_hdr *ip6; struct ifaddr *ifa; + struct ifnet *ifp; int _s; MGETHDR(m, M_DONTWAIT, MT_HEADER); @@ -1168,7 +1171,12 @@ carp_send_ad(void *v) memset(&sa, 0, sizeof(sa)); sa.sa_family = AF_INET6; _s = pserialize_read_enter(); - ifa = ifaof_ifpforaddr(&sa, sc->sc_carpdev); + ifp = sc->sc_carpdev; + ifa = ifaof_ifpforaddr(&sa, ifp); + if (ifa == NULL) { /* This should never happen with IPv6 */ + ifp = &sc->sc_if; + ifa = ifaof_ifpforaddr(&sa, ifp); + } if (ifa == NULL) /* This should never happen with IPv6 */ memset(&ip6->ip6_src, 0, sizeof(struct in6_addr)); else @@ -1179,7 +1187,7 @@ carp_send_ad(void *v) ip6->ip6_dst.s6_addr16[0] = htons(0xff02); ip6->ip6_dst.s6_addr8[15] = 0x12; - if (in6_setscope(&ip6->ip6_dst, &sc->sc_if, NULL) != 0) { + if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0) { if_statinc(&sc->sc_if, if_oerrors); m_freem(m); CARP_LOG(sc, ("in6_setscope failed"));