NAME | SYNOPSIS | DESCRIPTION | ADDRESSING | PROTOCOLS | ATTRIBUTES | SEE ALSO | STANDARDS | HISTORY | BUGS
#include <sys/types.h> #include <netinet/in.h>
The inet6 family is an updated version of the INET(7P) family of protocols. INET(7P) implements Internet Protocol version 4, and inet6 implements Internet Protocol version 6.
inet6 is a collection of protocols layered on top of the Internet Protocol version 6 (IPv6) transport layer, and utilizing the IPv6 address format. The inet6 family provides protocol support for the SOCK_STREAM, SOCK_DGRAM, and SOCK_RAW socket types; the SOCK_RAW interface provides access to the IPv6 protocol.
IPv6 addresses are 16 byte quantities, stored in network standard byte order. The include file <netinet/in.h> defines this address as a discriminated union.
Sockets bound to the inet6 family utilize the following addressing structure:
struct sockaddr_in6 { u_int8_t sin6_len; u_int8_t sin6_family; u_int16_t sin6_port; u_int32_t sin6_flowinfo; struct in6_addr sin6_addr; u_int32_t sin6_scope_id; };
A socket with a local address of :: (equivalent to the IPv6 address 0:0:0:0:0:0:0:0) enables wildcard matching on incoming messages. The connect(2POSIX) andsendto(2POSIX) calls treat an address of :: as "this host". To set a socket address to :: set the sin6_addr field to 0 or to the address contained in the variable in6addr_any.
The IPv6 specification defines scoped address, such as link-local or site-local address. A scoped address is ambiguous to the microkernel if it is specified without scope identifier. To manipulate scoped addresses properly from user space, programs must use advanced API defined in RFC2292. A compact description of the advanced API is available in ip6(7P). If scoped addresses are specified without explicit scope, the microkernel may raise error. Note that scoped addresses are rarely used at this moment, both from specification and implementation point of view.
The KAME implementation supports extended numeric IPv6 address notation for link-local addresses, like fe80::1%de0' to specify fe80::1 on de0interface. The notation is supported by getaddrinfo(3STDC) and getnameinfo(3). Some user space programs, such as telnetd(1M) or tftpd(1M), are able to use the notation. With special programs like ping6(1M), you can specify outgoing interface by extra command line option to resolve scoped addresses.
The inet6 family contains the IPv6 network protocol, ip6(7P), Internet Control Message Protocol version 6 (icmp6(7P), Transmission Control Protocol (TCP(7P)), and User Datagram Protocol (UDP(7P)). TCP is used to support the SOCK_STREAM abstractio. UDP is used to support the SOCK_DGRAM abstraction. Note that TCP and UDP are common to INET(7P) and inet6. A raw interface to IPv6 is available using an Internet socket of type SOCK_RAW. The ICMPv6 message protocol is accessible from a raw socket.
A number of variables are implemented in the net.inet6 branch of the sysctl(3POSIX) MIB. In addition to the variables supported by the transport protocols (for which the respective manual pages may be consulted), the following general variables are defined:
(ip6.forwarding) Boolean: enable/disable forwarding of IPv6 packets. Also, determine whether the node is acting as a router. Defaults to off.
(ip6.redirect) Boolean: enable/disable sending of ICMPv6 redirects in response to unforwardable IPv6 packets. This option is ignored unless the node is routing IPv6 packets, and should normally be enabled on all systems. Defaults to on.
(ip6.hlim) Integer: default hop limit value to use for outgoing IPv6 packets. This value applies to all the transport protocols over IPv6. There are APIs to override the value.
(ip6.maxfragpackets) Integer: default maximum number of fragmented packets the node accepts. 0 means that the node does not accept any fragmented packets. -1 means that the node accepts all fragmented packets it receives. The flag is provided basically for avoiding possible DoS (denial of service) attacks.
(ip6.accept_rtadv) Boolean: enable/disable receiving of ICMPv6 router advertisement packets, and autoconfiguration of address prefixes and default routers. The node must be a host (not a router) for the option to be meaningful. Defaults to off.
(ip6.log_interval) Integer: default interval in seconds between IPv6 packet forwarding engine and log output .
(ip6.hdrnestlimit) Integer: default number of maximum IPv6 extension headers permitted on incoming IPv6 packets. If set to 0, the node will accept as many extension headers as possible.
(ip6.dad_count) Integer: default number of IPv6 DAD (duplicated address detection) probe packets. The packets will be generated when IPv6 interface addresses are configured.
(ip6.auto_flowlabel) Boolean: enable/disable automatic filling of the IPv6 flowlabel field, for outstanding connected transport protocol packets. The field might be used by intermediate routers to identify packet flows. Defaults to on.
(ip6.defmcasthlim) Integer: default hop limit value for an IPv6 multicast packet sourced by the node. This value applies to all the transport protocols on top of IPv6. There are APIs to override the value as documented inip6(7P).
(ip6.gifhlim) Integer: default maximum hop limit value for an IPv6 packet generated by gif(7P) tunnel interface.
(ip6.kame_version) String: identifies the version of KAME IPv6 stack implemented in the microkernel.
(ip6.use_deprecated) Boolean: enable/disable use of deprecated address, specified in RFC2462 5.5.4. Defaults to on.
(ip6.rr_prune) Integer: default interval between IPv6 router renumbering prefix babysitting, in seconds.
(ip6.mapped_addr) Boolean: enable/disable use of IPv4 mapped addresses on AF_INET6 sockets. Defaults to on.
(ip6.rtexpire) Integer: lifetime in seconds of protocol-cloned IP routes after the last reference drops (default one hour).
(ip6.rtminexpire) Integer: minimum value of ip.rtexpire (default ten seconds).
(ip6.rtmaxcache) Integer: trigger level of cached, unreferenced, protocol-cloned routes which initiates dynamic adaptation (default 128).
The behavior of AF_INET6 TCP/UDP socket is documented in RFC2553. and can be mapped as follows:
Specific bind on AF_INET6 socket (bind(2POSIX) with address specified) should accept IPv6 traffic to that address only. If you perform wildcard bind on AF_INET6 socket (bind(2POSIX) to IPv6 address ::), and there is no wildcard bind AF_INET socket on that TCP/UDP port, IPv6 traffic as well as IPv4 traffic should be routed to that AF_INET6 socket. IPv4 traffic should be seen as coming from an IPv6 address like ::ffff:10.1.1.1. This is called an IPv4 mapped address.
If there are both wildcard bind AF_INET socket and wildcard bind AF_INET6 socket on one TCP/UDP port, they should behave separately. IPv4 traffic should be routed to AF_INET socket and IPv6 should be routed to AF_INET6 socket.
RFC2553 does not impose constraints on the order of bind(2POSIX) calls, or whether the IPv6 TCP and UDP port numbers should be treated separately or integrated. To avoid problems when interworking with other implementations and accepting both IPv4 and IPv6 traffic, listen to two sockets, one for AF_NET and one for AF_NET6. When handling connections from an IPv4 mapped address to an AF_NET6 socket, ensure that access control has not been bypassed.
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
---|---|
Interface Stability | Evolving |
Tatsuya Jinmei and Atsushi Onoe, An Extension of Format for IPv6 Scoped Addresses, internet draft, draft-ietf-ipngwg-scopedaddr-format-02.txt, June 2000, work in progress material.
The inet6 protocol interface are defined in RFC2553 and RFC2292. The implementation described herein appeared in WIDE/KAME project.
The IPv6 support is subject to change as the Internet protocols develop. Users should not depend on details of the current implementation, but rather the services exported.
Users are suggested to implement ``version independent'' code as much as possible, as you will need to support both inet(7P) and inet6(7P).
NAME | SYNOPSIS | DESCRIPTION | ADDRESSING | PROTOCOLS | ATTRIBUTES | SEE ALSO | STANDARDS | HISTORY | BUGS