> On 7 September 2020, at 13:57, Michael Tuexen 
> <michael.tue...@lurchi.franken.de> wrote:
> 
>> On 7. Sep 2020, at 22:48, Doug Hardie <bc...@lafn.org> wrote:
>> 
>> 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.
> Would using SCTP/UDP/IPv[46] be an option? It is supported by the FreeBSD 
> kernel.
> See https://tools.ietf.org/html/rfc6951#section-6 for the socket API for it.

Perhaps I am not understanding this completely, but I believe that it requires 
UDP encapsulation which is mostly user land code.  Thus there would be two 
implementations of SCTP in the system.  I don't think that is the best approach.

>> 
>> 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.
> For UDP and TCP you always get IPv6 addresses on AF_INET6 sockets. If you are 
> actually using IPv4, IPv4-mapped IPv6 addresses are used. For SCTP you an 
> choose if you want IPv4-mapped IPv6 addresses or IPv4 address. It is 
> controlled by
> the socket option specified in 
> https://tools.ietf.org/html/rfc6458#section-8.1.15

That would simplify my code so I am going to implement it.  Thanks.

>> 
>> Was this difference intended, or is it likely to change in the future?
> I think it is intended.

I had a feeling that would be the case, but I would think consistency would be 
more helpful to those using the services.

> 
> Best regards
> Michael

-- Doug


_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to