[Bug 279881] socket support for IPv4-mapped IPv6 misbehave

From: <bugzilla-noreply_at_freebsd.org>
Date: Thu, 20 Jun 2024 16:30:32 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=279881

            Bug ID: 279881
           Summary: socket support for IPv4-mapped IPv6 misbehave
           Product: Base System
           Version: 14.1-STABLE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: kern
          Assignee: bugs@FreeBSD.org
          Reporter: zonyitoo@gmail.com

When using IPv4-mapped IPv6 address with socket, no matter sysctl
net.inet6.ip6.v6only was set to 0 or 1, operations will always success.

Here is a test program in Python:

import socket
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, 0)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
s.connect(('::ffff:169.254.1.1', 53))
print(s.getsockname())

1. No matter net.inet6.ip6.v6only was set to 0 or 1, the program above will
always run without any errors.

2. No matter net.inet6.ip6.v6only was set to 0 or 1, delete the call
setsockopt(IPV6_V6ONLY) will always run without any errors. (UNEXPECTED)

3. If changed the set(IPV6_V6ONLY) line to 1, then the connect() call will fail
with an EINVAL error. (EXPECTED)

Based on my experience on Linux, if sockopt IPV6_V6ONLY was not set explicitly,
it should derived from the system's global configuration, in FreeBSD it should
be net.inet6.ip6.v6only.

Here is another problem, which I think it should be a special design in
FreeBSD:

If net.inet6.ip6.v6only was set to 1, even the problem like above could run
without error, and then send packets to the target address (IPv4-mapped IPv6)
with sendto(), the target socket couldn't receive the packet from recvfrom().

I suspected that it is because net.inet6.ip6.v6only=1 disables routing
IPv4-mapped IPv6 to IPv4 target.

Overall, in this issue I want to suggest:

1. sockopt IPV6_V6ONLY default value should derive from net.inet6.ip6.v6only
2. If sockopt IPV6_V6ONLY was set to 0 explicitly, then IPv4-mapped IPv6
packets send from or receive by this socket should be allowed / properly
routed.

-- 
You are receiving this mail because:
You are the assignee for the bug.