#include <sys/types.h> #include <netinet/in.h>
TCP supports the socket interface's SOCK_STREAM abstraction and TLI's T_COTS_ORD service type. UDP supports the SOCK_DGRAM socket abstraction and the TLI T_CLTS service type. See tcp(4P) and udp(4P). A direct interface to IPv6 is available using the socket interface. See ip6(4P). ICMPv6 is used by the kernel to handle and report errors in protocol processing. It is also accessible to user programs. See icmp6(4P). NDP is used to translate 128-bit IPv6 addresses into 48-bit Ethernet addresses.
IPv6 addresses come in three types: unicast, anycast, and multicast. A unicast address is an identifier for a single network interface. An anycast address is an identifier for a set of interfaces; a packet sent to an anycast address is delivered to the "nearest" interface identified by that address, pursuant to the routing protocol's measure of distance. A multicast address is an identifier for a set of interfaces; a packet sent to a multicast address is delivered to all interfaces identified by that address. There are no broadcast addresses as such in IPv6; their functionality is superseded by multicast addresses.
For IPv6 addresses, there are three scopes within which unicast addresses are guaranteed to be unique. The scope is indicated by the address prefix. The three varieties are link-local (the address is unique on that physical link), site-local (the address is unique within that site), and global (the address is globally unique).
The three highest order bits for global unicast addresses are set to 001. The ten highest order bits for site-local addresses are set to 1111 1110 11. The ten highest order bits for link-local addresses are set to 1111 1110 11. For multicast addresses, the eight highest order bits are set to 1111 1111. Anycast addresses have the same format as unicast addresses.
IPv6 addresses do not follow the concept of "address class" seen in IP.
A global unicast address is divided into the following segments:
Link-local unicast addresses are divided in this manner:
Site-local unicast addresses are divided in this manner:
sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; uint32_t __sin6_src_id;
Library routines are provided to manipulate structures of this form. See inet(3C).
The sin6_addr field of the sockaddr_in6 structure specifies a local or remote IPv6 address. Each network interface has one or more IPv6 addresses configured, that is, a link-local address, a site-local address, and one or more global unicast IPv6 addresses. The special value of all zeros may be used on this field to test for "wildcard" matching. Given in a bind(3SOCKET) call, this value leaves the local IPv6 address of the socket unspecified, so that the socket will receive connections or messages directed at any of the valid IPv6 addresses of the system. This can prove useful when a process neither knows nor cares what the local IPv6 address is, or when a process wishes to receive requests using all of its network interfaces.
The sockaddr_in6 structure given in the bind() call must specify an in6_addr value of either all zeros or one of the system's valid IPv6 addresses. Requests to bind any other address will elicit the error EADDRNOTAVAI. When a connect(3SOCKET) call is made for a socket that has a wildcard local address, the system sets the sin6_addr field of the socket to the IPv6 address of the network interface through which the packets for that connection are routed.
The sin6_port field of the sockaddr_in6 structure specifies a port number used by TCP or UDP. The local port address specified in a bind() call is restricted to be greater than IPPORT_RESERVED (defined in <netinet/in.h>) unless the creating process is running as the super-user, providing a space of protected port numbers. In addition, the local port address cannot be in use by any socket of the same address family and type. Requests to bind sockets to port numbers being used by other sockets return the error EADDRINUSE. If the local port address is specified as 0, the system picks a unique port address greater than IPPORT_RESERVED. A unique local port address is also selected when a socket which is not bound is used in a connect(3SOCKET) or sendto() call. See send(3SOCKET). This allows programs that do not care which local port number is used to set up TCP connections by simply calling socket(3SOCKET) and then connect(3SOCKET), and then sending UDP datagrams with a socket() call followed by a sendto() call.
Although this implementation restricts sockets to unique local port numbers, TCP allows multiple simultaneous connections involving the same local port number so long as the remote IPv6 addresses or port numbers are different for each connection. Programs may explicitly override the socket restriction by setting the SO_REUSEADDR socket option with setsockopt(). See getsockopt(3SOCKET).
In addition, the same port may be bound by two separate sockets if one is an IP socket and the other an IPv6 socket.
TLI applies somewhat different semantics to the binding of local port numbers. These semantics apply when Internet family protocols are used using the TLI.
Conceptually, each selection rule prefers one address over another, or determines their equivalence. If a rule produces a tie, a subsequent rule is used to break the tie.
The sense of some rules may be reversed on a per-socket basis using the IPV6_SRC_PREFERENCES socket option (see ip6(4P)). The flag values for this option are defined in <netinet/in.h> and are referenced in the description of the appropriate rules below.
As the selection rules indicate, the candidate addresses are SA and SB and the destination is D.
Prefer the same address
Prefer appropriate scope
If Scope(SA) < Scope(SB): If Scope(SA) < Scope(D), then prefer SB and otherwise prefer SA.
If Scope(SB) < Scope(SA): If Scope(SB) < Scope(D), then prefer SA and otherwise prefer SB.
Avoid deprecated addresses
Prefer preferred addresses
Prefer outgoing interface
Prefer matching label
If Label(SA) == Label(D) and Label(SB) != Label(D), then prefer SA.
If Label(SB) == Label(D) and Label(SA) != Label(D), then prefer SB.
Prefer public addresses
The sense of this rule may be set on a per-socket basis using the IPV6_SRC_PREFERENCES socket option. Passing the flag IPV6_PREFER_SRC_TMP or IPV6_PREFER_SRC_PUBLIC will cause temporary or public addresses to be preferred, respectively, for that particular socket. See ip6(4P) for more information about IPv6 socket options.
Use longest matching prefix.
If SA ^ D < SB ^ D, then prefer SA.
If SB ^ D < SA ^ D, then prefer SB.
Applications can override this algorithm by calling bind(3SOCKET) and specifying an address.
Conta, A. and Deering, S., Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, RFC 1885, December 1995.
Deering, S. and Hinden, B., Internet Protocol, Version 6 (IPv6) Specification, RFC 1883, December 1995.
Hinden, B. and Deering, S., IP Version 6 Addressing Architecture, RFC 1884, December 1995.
Draves, R., RFC 3484, Default Address Selection for IPv6. The Internet Society. February 2003.
Narten, T., and Draves, R. RFC 3041, Privacy Extensions for Stateless Address Autoconfiguration in IPv6. The Internet Society. January 2001.
|March 30, 2022||OmniOS|