git: 7d4673d3a439 - main - netinet6: allow binding a raw socket to an anycast address

From: Lexi Winter <ivy_at_FreeBSD.org>
Date: Tue, 15 Jul 2025 05:13:00 UTC
The branch main has been updated by ivy:

URL: https://cgit.FreeBSD.org/src/commit/?id=7d4673d3a439d1394df6bed0f9a50235eab5630f

commit 7d4673d3a439d1394df6bed0f9a50235eab5630f
Author:     Lexi Winter <ivy@FreeBSD.org>
AuthorDate: 2025-07-15 05:11:40 +0000
Commit:     Lexi Winter <ivy@FreeBSD.org>
CommitDate: 2025-07-15 05:12:45 +0000

    netinet6: allow binding a raw socket to an anycast address
    
    Raw sockets have a separate check for this in rip6_bind() that was
    missed in the previous change.  This fixes e.g. 'ping -S' using an
    anycast address.
    
    Fixes: ca4b046105f6 ("netinet6: allow binding to anycast addresses")
    Reviewed by:    tuexen, kevans, des (previous version)
    Approved by:    kevans (mentor)
    Differential Revision:  https://reviews.freebsd.org/D50438
---
 sys/netinet6/raw_ip6.c      |  3 +--
 tests/sys/netinet6/addr6.sh | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 0379ef7c789a..c90a1213bd66 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -765,8 +765,7 @@ rip6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 	}
 	if (ifa != NULL &&
 	    ((struct in6_ifaddr *)ifa)->ia6_flags &
-	    (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY|
-	     IN6_IFF_DETACHED|IN6_IFF_DEPRECATED)) {
+	    (IN6_IFF_NOTREADY|IN6_IFF_DETACHED|IN6_IFF_DEPRECATED)) {
 		NET_EPOCH_EXIT(et);
 		return (EADDRNOTAVAIL);
 	}
diff --git a/tests/sys/netinet6/addr6.sh b/tests/sys/netinet6/addr6.sh
index 38e4bb152240..6fd66d5aa0c7 100755
--- a/tests/sys/netinet6/addr6.sh
+++ b/tests/sys/netinet6/addr6.sh
@@ -39,7 +39,32 @@ addr6_invalid_addr_cleanup()
 	vnet_cleanup
 }
 
+atf_test_case "anycast_raw_addr" "cleanup"
+anycast_raw_addr_head()
+{
+	atf_set descr "a raw socket can bind to an anycast address"
+	atf_set require.user root
+}
+
+anycast_raw_addr_body()
+{
+	# lo0 needs to be up in the test jail for this test to work
+	ifconfig lo0 up
+
+	netif=$(ifconfig lo create)
+	echo $netif >netif
+	atf_check -s exit:0 ifconfig $netif inet6 2001:db8::1/128 up
+	atf_check -s exit:0 ifconfig $netif inet6 2001:db8::2/128 anycast
+	atf_check -s exit:0 -o ignore ping -c1 -S 2001:db8::2 2001:db8::1
+}
+
+anycast_raw_addr_cleanup()
+{
+	ifconfig $(cat netif) destroy
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case "addr6_invalid_addr"
+	atf_add_test_case "anycast_raw_addr"
 }