Address Differences between UDP and SCTP
Doug Hardie
bc979 at lafn.org
Mon Sep 7 20:48:42 UTC 2020
I was quite surprised to discover that the sockaddr structure returned from recv_fd and recvfrom handle IPv4 addresses differently when using an INET6 socket. I don't know if this was intended, or a side effect. I started using SCTP because of the need for accessing multi-homed servers. Some would be on IPv6 and others on IPv4. SCTP handles that nicely if you use an INET6 socket. When a transaction is received, if it is to an IPv4 address, then the returned sockaddr will have a inet_family of IPv4 and the IPv4 structure. If it was sent to an IPv6 address, then the inet6_family is used. A simple test of the family tells you which address format was provided and the address is in IPv4 or IPv6 format accordingly.
However, A new site needed to be added and it is behind a NAT router. The problem with SCTP is that most (possibly all) NAT routers only work with TCP and UDP. They will not port forward SCTP. So I have no way to get through to the machine. So I added code to check for that situation and use UDP instead. This will work because I don't thing it is at all likely that a machine behind NAT can be multi-homed.
However, the code to obtain the remote IP address failed miserably. It turns out that if you have v6only set to 1, you will never see the IPv4 packets. If you set it to 0, then you get the packets, but the sockaddr format with UDP is different than that for SCTP. If it is an IPv6 address, everything is the same. However, if it is an IPv4 address, then the family remains IPv6, and the address is in sin6_addr and it is in the format ::ffff:n.n.n.n. This makes it interesting as I need to obtain the IPv4 address as part of the verification process that the transaction is authorized.
Was this difference intended, or is it likely to change in the future?
-- Doug
More information about the freebsd-net
mailing list