Index | Thread | Search

From:
David Gwynne <david@gwynne.id.au>
Subject:
have icmp6_reflect use route sourceaddr
To:
tech@openbsd.org
Date:
Thu, 3 Jul 2025 14:44:18 +1000

Download raw body.

Thread
this follows the pattern for source address selection in in6_src.c.
this brings it into line with ipv4 and ipv6 pcb source address selection
and ipv4 icmp_reflect source address selection.

Index: icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
diff -u -p -r1.267 icmp6.c
--- icmp6.c	12 Jun 2025 20:37:59 -0000	1.267
+++ icmp6.c	3 Jul 2025 04:35:58 -0000
@@ -1139,6 +1139,20 @@ icmp6_reflect(struct mbuf **mp, size_t o
 			src = &ia6->ia_addr.sin6_addr;
 		if (src == NULL)
 			src = &ifatoia6(rt->rt_ifa)->ia_addr.sin6_addr;
+
+		/* route sourceaddr may override src address selection */
+		if (ISSET(rt->rt_flags, RTF_GATEWAY)) {
+			struct sockaddr *sourceaddr;
+
+			sourceaddr = rtable_getsource(rtableid, AF_INET6);
+			if (sourceaddr != NULL) {
+				struct ifaddr *ifa;
+				ifa = ifa_ifwithaddr(sourceaddr, rtableid);
+				if (ifa != NULL &&
+				    ISSET(ifa->ifa_ifp->if_flags, IFF_UP))
+					src = &satosin6(sourceaddr)->sin6_addr;
+			}
+		}
 	}
 
 	ip6->ip6_src = *src;