summaryrefslogtreecommitdiff
path: root/static/netbsd/man4/ip6.4 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man4/ip6.4 3.html')
-rw-r--r--static/netbsd/man4/ip6.4 3.html561
1 files changed, 0 insertions, 561 deletions
diff --git a/static/netbsd/man4/ip6.4 3.html b/static/netbsd/man4/ip6.4 3.html
deleted file mode 100644
index b869b739..00000000
--- a/static/netbsd/man4/ip6.4 3.html
+++ /dev/null
@@ -1,561 +0,0 @@
-<table class="head">
- <tr>
- <td class="head-ltitle">IP6(4)</td>
- <td class="head-vol">Device Drivers Manual</td>
- <td class="head-rtitle">IP6(4)</td>
- </tr>
-</table>
-<div class="manual-text">
-<section class="Sh">
-<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
-<p class="Pp"><code class="Nm">ip6</code> &#x2014; <span class="Nd">Internet
- Protocol version 6 (IPv6) network layer</span></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
-<p class="Pp"><code class="In">#include
- &lt;<a class="In">sys/socket.h</a>&gt;</code>
- <br/>
- <code class="In">#include &lt;<a class="In">netinet/in.h</a>&gt;</code></p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">socket</code>(<var class="Fa" style="white-space: nowrap;">AF_INET6</var>,
- <var class="Fa" style="white-space: nowrap;">SOCK_RAW</var>,
- <var class="Fa" style="white-space: nowrap;">proto</var>);</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
-<p class="Pp">The IPv6 network layer is used by the IPv6 protocol family for
- transporting data. IPv6 packets contain an IPv6 header that is not provided
- as part of the payload contents when passed to an application. IPv6 header
- options affect the behavior of this protocol and may be used by high-level
- protocols (such as the <a class="Xr">tcp(4)</a> and <a class="Xr">udp(4)</a>
- protocols) as well as directly by &#x201C;raw sockets&#x201D;, which process
- IPv6 messages at a lower-level and may be useful for developing new
- protocols and special-purpose applications.</p>
-<section class="Ss">
-<h2 class="Ss" id="Header"><a class="permalink" href="#Header">Header</a></h2>
-<p class="Pp">All IPv6 packets begin with an IPv6 header. When data received by
- the kernel are passed to the application, this header is not included in
- buffer, even when raw sockets are being used. Likewise, when data are sent
- to the kernel for transmit from the application, the buffer is not examined
- for an IPv6 header: the kernel always constructs the header. To directly
- access IPv6 headers from received packets and specify them as part of the
- buffer passed to the kernel, link-level access (<a class="Xr">bpf(4)</a>,
- for example) must be used instead.</p>
-<p class="Pp">The header has the following definition:</p>
-<div class="Bd Pp Bd-indent Li">
-<pre>struct ip6_hdr {
- union {
- struct ip6_hdrctl {
- uint32_t ip6_un1_flow; /* 20 bits of flow ID */
- uint16_t ip6_un1_plen; /* payload length */
- uint8_t ip6_un1_nxt; /* next header */
- uint8_t ip6_un1_hlim; /* hop limit */
- } ip6_un1;
- uint8_t ip6_un2_vfc; /* version and class */
- } ip6_ctlun;
- struct in6_addr ip6_src; /* source address */
- struct in6_addr ip6_dst; /* destination address */
-} __packed;
-
-#define ip6_vfc ip6_ctlun.ip6_un2_vfc
-#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
-#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
-#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
-#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
-#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim</pre>
-</div>
-<p class="Pp">All fields are in network-byte order. Any options specified (see
- <a class="Sx" href="#Options">Options</a> below) must also be specified in
- network-byte order.</p>
-<p class="Pp"><var class="Va">ip6_flow</var> specifies the flow ID.
- <var class="Va">ip6_plen</var> specifies the payload length.
- <var class="Va">ip6_nxt</var> specifies the type of the next header.
- <var class="Va">ip6_hlim</var> specifies the hop limit.</p>
-<p class="Pp">The top 4 bits of <var class="Va">ip6_vfc</var> specify the class
- and the bottom 4 bits specify the version.</p>
-<p class="Pp"><var class="Va">ip6_src</var> and <var class="Va">ip6_dst</var>
- specify the source and destination addresses.</p>
-<p class="Pp">The IPv6 header may be followed by any number of extension headers
- that start with the following generic definition:</p>
-<div class="Bd Pp Bd-indent Li">
-<pre>struct ip6_ext {
- uint8_t ip6e_nxt;
- uint8_t ip6e_len;
-} __packed;</pre>
-</div>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Options"><a class="permalink" href="#Options">Options</a></h2>
-<p class="Pp">IPv6 allows header options on packets to manipulate the behavior
- of the protocol. These options and other control requests are accessed with
- the <a class="Xr">getsockopt(2)</a> and <a class="Xr">setsockopt(2)</a>
- system calls at level <code class="Dv">IPPROTO_IPV6</code> and by using
- ancillary data in <a class="Xr">recvmsg(2)</a> and
- <a class="Xr">sendmsg(2)</a>. They can be used to access most of the fields
- in the IPv6 header and extension headers.</p>
-<p class="Pp">The following socket options are supported:</p>
-<dl class="Bl-tag">
- <dt id="IPV6_UNICAST_HOPS"><a class="permalink" href="#IPV6_UNICAST_HOPS"><code class="Dv">IPV6_UNICAST_HOPS</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the default hop limit header field for outgoing unicast
- datagrams sent on this socket. A value of -1 resets to the default
- value.</dd>
- <dt id="IPV6_MULTICAST_IF"><a class="permalink" href="#IPV6_MULTICAST_IF"><code class="Dv">IPV6_MULTICAST_IF</code></a>
- <var class="Fa">u_int *</var></dt>
- <dd>Get or set the interface from which multicast packets will be sent. For
- hosts with multiple interfaces, each multicast transmission is sent from
- the primary network interface. The interface is specified as its index as
- provided by <a class="Xr">if_nametoindex(3)</a>. A value of zero specifies
- the default interface.</dd>
- <dt id="IPV6_MULTICAST_HOPS"><a class="permalink" href="#IPV6_MULTICAST_HOPS"><code class="Dv">IPV6_MULTICAST_HOPS</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the default hop limit header field for outgoing multicast
- datagrams sent on this socket. This option controls the scope of multicast
- datagram transmissions.
- <p class="Pp">Datagrams with a hop limit of 1 are not forwarded beyond the
- local network. Multicast datagrams with a hop limit of zero will not be
- transmitted on any network but may be delivered locally if the sending
- host belongs to the destination group and if multicast loopback (see
- below) has not been disabled on the sending socket. Multicast datagrams
- with a hop limit greater than 1 may be forwarded to the other networks
- if a multicast router (such as <a class="Xr">mrouted(8)</a>) is attached
- to the local network.</p>
- </dd>
- <dt id="IPV6_MULTICAST_LOOP"><a class="permalink" href="#IPV6_MULTICAST_LOOP"><code class="Dv">IPV6_MULTICAST_LOOP</code></a>
- <var class="Fa">u_int *</var></dt>
- <dd>Get or set the status of whether multicast datagrams will be looped back
- for local delivery when a multicast datagram is sent to a group to which
- the sending host belongs.
- <p class="Pp">This option improves performance for applications that may
- have no more than one instance on a single host (such as a router
- daemon) by eliminating the overhead of receiving their own
- transmissions. It should generally not be used by applications for which
- there may be more than one instance on a single host (such as a
- conferencing program) or for which the sender does not belong to the
- destination group (such as a time-querying program).</p>
- <p class="Pp">A multicast datagram sent with an initial hop limit greater
- than 1 may be delivered to the sending host on a different interface
- from that on which it was sent if the host belongs to the destination
- group on that other interface. The multicast loopback control option has
- no effect on such delivery.</p>
- </dd>
- <dt id="IPV6_JOIN_GROUP"><a class="permalink" href="#IPV6_JOIN_GROUP"><code class="Dv">IPV6_JOIN_GROUP</code></a>
- <var class="Fa">struct ipv6_mreq *</var></dt>
- <dd>Join a multicast group. A host must become a member of a multicast group
- before it can receive datagrams sent to the group.
- <div class="Bd Pp Li">
- <pre>struct ipv6_mreq {
- struct in6_addr ipv6mr_multiaddr;
- unsigned int ipv6mr_interface;
-};</pre>
- </div>
- <p class="Pp"><var class="Va">ipv6mr_interface</var> may be set to zeroes to
- choose the default multicast interface or to the index of a particular
- multicast-capable interface if the host is multihomed. Membership is
- associated with a single interface; programs running on multihomed hosts
- may need to join the same group on more than one interface.</p>
- <p class="Pp">If the multicast address is unspecified (i.e., all zeroes),
- messages from all multicast addresses will be accepted by this group.
- Note that setting to this value requires superuser privileges.</p>
- </dd>
- <dt id="IPV6_LEAVE_GROUP"><a class="permalink" href="#IPV6_LEAVE_GROUP"><code class="Dv">IPV6_LEAVE_GROUP</code></a>
- <var class="Fa">struct ipv6_mreq *</var></dt>
- <dd>Drop membership from the associated multicast group. Memberships are
- automatically dropped when the socket is closed or when the process
- exits.</dd>
- <dt id="IPV6_IPSEC_POLICY"><a class="permalink" href="#IPV6_IPSEC_POLICY"><code class="Dv">IPV6_IPSEC_POLICY</code></a>
- <var class="Fa">struct sadb_x_policy *</var></dt>
- <dd>Get or set IPSec policy for sockets. For example,
- <div class="Bd Pp Li">
- <pre>const char *policy = &quot;in ipsec ah/transport//require&quot;;
-char *buf = ipsec_set_policy(policy, strlen(policy));
-setsockopt(s, IPPROTO_IPV6, IPV6_IPSEC_POLICY, buf, ipsec_get_policylen(buf));</pre>
- </div>
- </dd>
- <dt id="IPV6_PORTALGO"><a class="permalink" href="#IPV6_PORTALGO"><code class="Dv">IPV6_PORTALGO</code></a>
- <var class="Fa">int *</var></dt>
- <dd>The <code class="Dv">IP_PORTALGO</code> can be used to randomize the port
- selection. Valid algorithms are described in <a class="Xr">rfc6056(7)</a>
- and their respective constants are in
- <code class="In">&lt;<a class="In">netinet/portalgo.h</a>&gt;</code>. For
- example,
- <div class="Bd Pp Li">
- <pre>int algo = PORTALGO_ALGO_RANDOM_PICK; /* see &lt;netinet/portalgo.h&gt; */
-setsockopt(s, IPPROTO_IPV6, IPV6_PORTALGO, &amp;algo, sizeof(algo));</pre>
- </div>
- <p class="Pp">The port selection can be also viewed and controlled at a
- global level for all IPV6 sockets using the following
- <a class="Xr">sysctl(7)</a> variables:
- <code class="Dv">net.inet6.ip6.anonportalgo.available</code> and
- <code class="Dv">net.inet6.ip6.anonportalgo.selected</code>.</p>
- </dd>
- <dt id="IPV6_PORTRANGE"><a class="permalink" href="#IPV6_PORTRANGE"><code class="Dv">IPV6_PORTRANGE</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the allocation policy of ephemeral ports for when the kernel
- automatically binds a local address to this socket. The following values
- are available:
- <p class="Pp"></p>
- <dl class="Bl-tag Bl-compact">
- <dt id="IPV6_PORTRANGE_DEFAULT"><a class="permalink" href="#IPV6_PORTRANGE_DEFAULT"><code class="Dv">IPV6_PORTRANGE_DEFAULT</code></a></dt>
- <dd>Use the regular range of non-reserved ports (varies, see
- <a class="Xr">sysctl(8)</a>).</dd>
- <dt id="IPV6_PORTRANGE_HIGH"><a class="permalink" href="#IPV6_PORTRANGE_HIGH"><code class="Dv">IPV6_PORTRANGE_HIGH</code></a></dt>
- <dd>Use a high range (varies, see <a class="Xr">sysctl(8)</a>).</dd>
- <dt id="IPV6_PORTRANGE_LOW"><a class="permalink" href="#IPV6_PORTRANGE_LOW"><code class="Dv">IPV6_PORTRANGE_LOW</code></a></dt>
- <dd>Use a low, reserved range (600-1023).</dd>
- </dl>
- </dd>
- <dt id="IPV6_PKTINFO"><a class="permalink" href="#IPV6_PKTINFO"><code class="Dv">IPV6_PKTINFO</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether additional information about subsequent packets will be
- provided as ancillary data along with the payload in subsequent
- <a class="Xr">recvmsg(2)</a> calls. The information is stored in the
- following structure in the ancillary data returned:
- <div class="Bd Pp Li">
- <pre>struct in6_pktinfo {
- struct in6_addr ipi6_addr; /* src/dst IPv6 address */
- unsigned int ipi6_ifindex; /* send/recv if index */
-};</pre>
- </div>
- </dd>
- <dt id="IPV6_HOPLIMIT"><a class="permalink" href="#IPV6_HOPLIMIT"><code class="Dv">IPV6_HOPLIMIT</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether the hop limit header field from subsequent packets will
- be provided as ancillary data along with the payload in subsequent
- <a class="Xr">recvmsg(2)</a> calls. The value is stored as an
- <var class="Vt">int</var> in the ancillary data returned.</dd>
- <dt id="IPV6_HOPOPTS"><a class="permalink" href="#IPV6_HOPOPTS"><code class="Dv">IPV6_HOPOPTS</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether the hop-by-hop options from subsequent packets will be
- provided as ancillary data along with the payload in subsequent
- <a class="Xr">recvmsg(2)</a> calls. The option is stored in the following
- structure in the ancillary data returned:
- <div class="Bd Pp Li">
- <pre>struct ip6_hbh {
- uint8_t ip6h_nxt; /* next header */
- uint8_t ip6h_len; /* length in units of 8 octets */
-/* followed by options */
-} __packed;</pre>
- </div>
- <p class="Pp" id="inet6_option_space">The
- <a class="permalink" href="#inet6_option_space"><code class="Fn">inet6_option_space</code></a>()
- routine and family of routines may be used to manipulate this data.</p>
- <p class="Pp">This option requires superuser privileges.</p>
- </dd>
- <dt id="IPV6_DSTOPTS"><a class="permalink" href="#IPV6_DSTOPTS"><code class="Dv">IPV6_DSTOPTS</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether the destination options from subsequent packets will be
- provided as ancillary data along with the payload in subsequent
- <a class="Xr">recvmsg(2)</a> calls. The option is stored in the following
- structure in the ancillary data returned:
- <div class="Bd Pp Li">
- <pre>struct ip6_dest {
- uint8_t ip6d_nxt; /* next header */
- uint8_t ip6d_len; /* length in units of 8 octets */
-/* followed by options */
-} __packed;</pre>
- </div>
- <p class="Pp" id="inet6_option_space~2">The
- <a class="permalink" href="#inet6_option_space~2"><code class="Fn">inet6_option_space</code></a>()
- routine and family of routines may be used to manipulate this data.</p>
- <p class="Pp">This option requires superuser privileges.</p>
- </dd>
- <dt id="IPV6_RTHDR"><a class="permalink" href="#IPV6_RTHDR"><code class="Dv">IPV6_RTHDR</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether the routing header from subsequent packets will be
- provided as ancillary data along with the payload in subsequent
- <a class="Xr">recvmsg(2)</a> calls. The header is stored in the following
- structure in the ancillary data returned:
- <div class="Bd Pp Li">
- <pre>struct ip6_rthdr {
- uint8_t ip6r_nxt; /* next header */
- uint8_t ip6r_len; /* length in units of 8 octets */
- uint8_t ip6r_type; /* routing type */
- uint8_t ip6r_segleft; /* segments left */
-/* followed by routing-type-specific data */
-} __packed;</pre>
- </div>
- <p class="Pp" id="inet6_option_space~3">The
- <a class="permalink" href="#inet6_option_space~3"><code class="Fn">inet6_option_space</code></a>()
- routine and family of routines may be used to manipulate this data.</p>
- <p class="Pp">This option requires superuser privileges.</p>
- </dd>
- <dt id="IPV6_PKTOPTIONS"><a class="permalink" href="#IPV6_PKTOPTIONS"><code class="Dv">IPV6_PKTOPTIONS</code></a>
- <var class="Fa">struct cmsghdr *</var></dt>
- <dd>Get or set all header options and extension headers at one time on the
- last packet sent or received on the socket. All options must fit within
- the size of an mbuf (see <a class="Xr">mbuf(9)</a>). Options are specified
- as a series of <var class="Vt">cmsghdr</var> structures followed by
- corresponding values. <var class="Va">cmsg_level</var> is set to
- <code class="Dv">IPPROTO_IPV6</code>, <var class="Va">cmsg_type</var> to
- one of the other values in this list, and trailing data to the option
- value. When setting options, if the length <var class="Va">optlen</var> to
- <a class="Xr">setsockopt(2)</a> is zero, all header options will be reset
- to their default values. Otherwise, the length should specify the size the
- series of control messages consumes.
- <p class="Pp">Instead of using <a class="Xr">sendmsg(2)</a> to specify
- option values, the ancillary data used in these calls that correspond to
- the desired header options may be directly specified as the control
- message in the series of control messages provided as the argument to
- <a class="Xr">setsockopt(2)</a>.</p>
- </dd>
- <dt id="IPV6_CHECKSUM"><a class="permalink" href="#IPV6_CHECKSUM"><code class="Dv">IPV6_CHECKSUM</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the byte offset into a packet where the 16-bit checksum is
- located. When set, this byte offset is where incoming packets will be
- expected to have checksums of their data stored and where outgoing packets
- will have checksums of their data computed and stored by the kernel. A
- value of -1 specifies that no checksums will be checked on incoming
- packets and that no checksums will be computed or stored on outgoing
- packets. The offset of the checksum for ICMPv6 sockets cannot be relocated
- or turned off.</dd>
- <dt id="IPV6_V6ONLY"><a class="permalink" href="#IPV6_V6ONLY"><code class="Dv">IPV6_V6ONLY</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether only IPv6 connections can be made to this socket. For
- wildcard sockets, this can restrict connections to IPv6 only.</dd>
- <dt id="IPV6_FAITH"><a class="permalink" href="#IPV6_FAITH"><code class="Dv">IPV6_FAITH</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the status of whether <a class="Xr">faith(4)</a> connections
- can be made to this socket.</dd>
- <dt id="IPV6_USE_MIN_MTU"><a class="permalink" href="#IPV6_USE_MIN_MTU"><code class="Dv">IPV6_USE_MIN_MTU</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set whether the minimal IPv6 maximum transmission unit (MTU) size
- will be used to avoid fragmentation from occurring for subsequent outgoing
- datagrams.</dd>
- <dt id="IPV6_AUTH_LEVEL"><a class="permalink" href="#IPV6_AUTH_LEVEL"><code class="Dv">IPV6_AUTH_LEVEL</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the <a class="Xr">ipsec(4)</a> authentication level.</dd>
- <dt id="IPV6_ESP_TRANS_LEVEL"><a class="permalink" href="#IPV6_ESP_TRANS_LEVEL"><code class="Dv">IPV6_ESP_TRANS_LEVEL</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the ESP transport level.</dd>
- <dt id="IPV6_ESP_NETWORK_LEVEL"><a class="permalink" href="#IPV6_ESP_NETWORK_LEVEL"><code class="Dv">IPV6_ESP_NETWORK_LEVEL</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the ESP encapsulation level.</dd>
- <dt id="IPV6_IPCOMP_LEVEL"><a class="permalink" href="#IPV6_IPCOMP_LEVEL"><code class="Dv">IPV6_IPCOMP_LEVEL</code></a>
- <var class="Fa">int *</var></dt>
- <dd>Get or set the <a class="Xr">ipcomp(4)</a> level.</dd>
- <dt id="IPV6_BINDANY"><a class="permalink" href="#IPV6_BINDANY"><code class="Dv">IPV6_BINDANY</code></a></dt>
- <dd>If this option is enabled on a <code class="Dv">SOCK_STREAM</code>,
- <code class="Dv">SOCK_DGRAM</code>, or a <code class="Dv">SOCK_RAW</code>
- socket, one can <a class="Xr">bind(2)</a> to any address, even one not
- bound to any available network interface in the system. This functionality
- (in conjunction with special firewall rules) can be used for implementing
- a transparent proxy. The
- <code class="Dv">KAUTH_REQ_NETWORK_BIND_ANYADDR</code> privilege is needed
- to set this option.</dd>
-</dl>
-<p class="Pp">The <code class="Dv">IPV6_PKTINFO</code>,
- <code class="Dv">IPV6_HOPLIMIT</code>, <code class="Dv">IPV6_HOPOPTS</code>,
- <code class="Dv">IPV6_DSTOPTS</code>, and <code class="Dv">IPV6_RTHDR</code>
- options will return ancillary data along with payload contents in subsequent
- <a class="Xr">recvmsg(2)</a> calls with <var class="Va">cmsg_level</var> set
- to <code class="Dv">IPPROTO_IPV6</code> and <var class="Va">cmsg_type</var>
- set to respective option name value (e.g.,
- <code class="Dv">IPV6_HOPTLIMIT</code>). These options may also be used
- directly as ancillary <var class="Va">cmsg_type</var> values in
- <a class="Xr">sendmsg(2)</a> to set options on the packet being transmitted
- by the call. The <var class="Va">cmsg_level</var> value must be
- <code class="Dv">IPPROTO_IPV6</code>. For these options, the ancillary data
- object value format is the same as the value returned as explained for each
- when received with <a class="Xr">recvmsg(2)</a>.</p>
-<p class="Pp">Note that using <a class="Xr">sendmsg(2)</a> to specify options on
- particular packets works only on UDP and raw sockets. To manipulate header
- options for packets on TCP sockets, only the socket options may be used.</p>
-<p class="Pp">In some cases, there are multiple APIs defined for manipulating an
- IPv6 header field. A good example is the outgoing interface for multicast
- datagrams, which can be set by the <code class="Dv">IPV6_MULTICAST_IF</code>
- socket option, through the <code class="Dv">IPV6_PKTINFO</code> option, and
- through the <var class="Va">sin6_scope_id</var> field of the socket address
- passed to the <a class="Xr">sendto(2)</a> system call.</p>
-<p class="Pp">Resolving these conflicts is implementation dependent. This
- implementation determines the value in the following way: options specified
- by using ancillary data (i.e., <a class="Xr">sendmsg(2)</a>) are considered
- first, options specified by using <code class="Dv">IPV6_PKTOPTIONS</code> to
- set &#x201C;sticky&#x201D; options are considered second, options specified
- by using the individual, basic, and direct socket options (e.g.,
- <code class="Dv">IPV6_UNICAST_HOPS</code>) are considered third, and options
- specified in the socket address supplied to <a class="Xr">sendto(2)</a> are
- the last choice.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Multicasting"><a class="permalink" href="#Multicasting">Multicasting</a></h2>
-<p class="Pp">IPv6 multicasting is supported only on
- <code class="Dv">AF_INET6</code> sockets of type
- <code class="Dv">SOCK_DGRAM</code> and <code class="Dv">SOCK_RAW</code>, and
- only on networks where the interface driver supports multicasting. Socket
- options (see above) that manipulate membership of multicast groups and other
- multicast options include <code class="Dv">IPV6_MULTICAST_IF</code>,
- <code class="Dv">IPV6_MULTICAST_HOPS</code>,
- <code class="Dv">IPV6_MULTICAST_LOOP</code>,
- <code class="Dv">IPV6_LEAVE_GROUP</code>, and
- <code class="Dv">IPV6_JOIN_GROUP</code>.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Raw_Sockets"><a class="permalink" href="#Raw_Sockets">Raw
- Sockets</a></h2>
-<p class="Pp">Raw IPv6 sockets are connectionless and are normally used with the
- <a class="Xr">sendto(2)</a> and <a class="Xr">recvfrom(2)</a> calls,
- although the <a class="Xr">connect(2)</a> call may be used to fix the
- destination address for future outgoing packets so that
- <a class="Xr">send(2)</a> may instead be used and the
- <a class="Xr">bind(2)</a> call may be used to fix the source address for
- future outgoing packets instead of having the kernel choose a source
- address.</p>
-<p class="Pp">By using <a class="Xr">connect(2)</a> or
- <a class="Xr">bind(2)</a>, raw socket input is constrained to only packets
- with their source address matching the socket destination address if
- <a class="Xr">connect(2)</a> was used and to packets with their destination
- address matching the socket source address if <a class="Xr">bind(2)</a> was
- used.</p>
-<p class="Pp" id="not">If the <var class="Ar">proto</var> argument to
- <a class="Xr">socket(2)</a> is zero, the default protocol
- (<code class="Dv">IPPROTO_RAW</code>) is used for outgoing packets. For
- incoming packets, protocols recognized by kernel are
- <a class="permalink" href="#not"><b class="Sy">not</b></a> passed to the
- application socket (e.g., <a class="Xr">tcp(4)</a> and
- <a class="Xr">udp(4)</a>) except for some ICMPv6 messages. The ICMPv6
- messages not passed to raw sockets include echo, timestamp, and address mask
- requests. If <var class="Ar">proto</var> is non-zero, only packets with this
- protocol will be passed to the socket.</p>
-<p class="Pp">IPv6 fragments are also not passed to application sockets until
- they have been reassembled. If reception of all packets is desired,
- link-level access (such as <a class="Xr">bpf(4)</a>) must be used
- instead.</p>
-<p class="Pp">Outgoing packets automatically have an IPv6 header prepended to
- them (based on the destination address and the protocol number the socket
- was created with). Incoming packets are received by an application without
- the IPv6 header or any extension headers.</p>
-<p class="Pp">Outgoing packets will be fragmented automatically by the kernel if
- they are too large. Incoming packets will be reassembled before being sent
- to the raw socket, so packet fragments or fragment headers will never be
- seen on a raw socket.</p>
-</section>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1>
-<p class="Pp">The following determines the hop limit on the next packet
- received:</p>
-<div class="Bd Pp Li">
-<pre>struct iovec iov[2];
-u_char buf[BUFSIZ];
-struct cmsghdr *cm;
-struct msghdr m;
-int found, optval;
-u_char data[2048];
-
-/* Create socket. */
-
-(void)memset(&amp;m, 0, sizeof(m));
-(void)memset(&amp;iov, 0, sizeof(iov));
-
-iov[0].iov_base = data; /* buffer for packet payload */
-iov[0].iov_len = sizeof(data); /* expected packet length */
-
-m.msg_name = &amp;from; /* sockaddr_in6 of peer */
-m.msg_namelen = sizeof(from);
-m.msg_iov = iov;
-m.msg_iovlen = 1;
-m.msg_control = buf; /* buffer for control messages */
-m.msg_controllen = sizeof(buf);
-
-/*
- * Enable the hop limit value from received packets to be
- * returned along with the payload.
- */
-optval = 1;
-if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &amp;optval,
- sizeof(optval)) == -1)
- err(1, &quot;setsockopt&quot;);
-
-found = 0;
-while (!found) {
- if (recvmsg(s, &amp;m, 0) == -1)
- err(1, &quot;recvmsg&quot;);
- for (cm = CMSG_FIRSTHDR(&amp;m); cm != NULL;
- cm = CMSG_NXTHDR(&amp;m, cm)) {
- if (cm-&gt;cmsg_level == IPPROTO_IPV6 &amp;&amp;
- cm-&gt;cmsg_type == IPV6_HOPLIMIT &amp;&amp;
- cm-&gt;cmsg_len == CMSG_LEN(sizeof(int))) {
- found = 1;
- (void)printf(&quot;hop limit: %d\n&quot;,
- *(int *)CMSG_DATA(cm));
- break;
- }
- }
-}</pre>
-</div>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DIAGNOSTICS"><a class="permalink" href="#DIAGNOSTICS">DIAGNOSTICS</a></h1>
-<p class="Pp">A socket operation may fail with one of the following errors
- returned:</p>
-<dl class="Bl-tag">
- <dt>[<code class="Er">EISCONN</code>]</dt>
- <dd>when trying to establish a connection on a socket which already has one or
- when trying to send a datagram with the destination address specified and
- the socket is already connected.</dd>
- <dt>[<code class="Er">ENOTCONN</code>]</dt>
- <dd>when trying to send a datagram, but no destination address is specified,
- and the socket hasn't been connected.</dd>
- <dt>[<code class="Er">ENOBUFS</code>]</dt>
- <dd>when the system runs out of memory for an internal data structure.</dd>
- <dt>[<code class="Er">EADDRNOTAVAIL</code>]</dt>
- <dd>when an attempt is made to create a socket with a network address for
- which no network interface exists.</dd>
- <dt>[<code class="Er">EACCES</code>]</dt>
- <dd>when an attempt is made to create a raw IPv6 socket by a non-privileged
- process.</dd>
-</dl>
-<p class="Pp">The following errors specific to IPv6 may occur when setting or
- getting header options:</p>
-<dl class="Bl-tag">
- <dt>[<code class="Er">EINVAL</code>]</dt>
- <dd>An unknown socket option name was given.</dd>
- <dt>[<code class="Er">EINVAL</code>]</dt>
- <dd>An ancillary data object was improperly formed.</dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
- ALSO</a></h1>
-<p class="Pp"><a class="Xr">getsockopt(2)</a>, <a class="Xr">recv(2)</a>,
- <a class="Xr">send(2)</a>, <a class="Xr">setsockopt(2)</a>,
- <a class="Xr">socket(2)</a>, <a class="Xr">CMSG_DATA(3)</a>,
- <a class="Xr">if_nametoindex(3)</a>, <a class="Xr">bpf(4)</a>,
- <a class="Xr">icmp6(4)</a>, <a class="Xr">inet6(4)</a>,
- <a class="Xr">netintro(4)</a>, <a class="Xr">tcp(4)</a>,
- <a class="Xr">udp(4)</a></p>
-<p class="Pp"><cite class="Rs"><span class="RsA">W. Stevens</span> and
- <span class="RsA">M. Thomas</span>, <span class="RsT">Advanced Sockets API
- for IPv6</span>, <span class="RsR">RFC 2292</span>,
- <span class="RsD">February 1998</span>.</cite></p>
-<p class="Pp"><cite class="Rs"><span class="RsA">S. Deering</span> and
- <span class="RsA">R. Hinden</span>, <span class="RsT">Internet Protocol,
- Version 6 (IPv6) Specification</span>, <span class="RsR">RFC 2460</span>,
- <span class="RsD">December 1998</span>.</cite></p>
-<p class="Pp"><cite class="Rs"><span class="RsA">R. Gilligan</span>,
- <span class="RsA">S. Thomson</span>, <span class="RsA">J. Bound</span>, and
- <span class="RsA">W. Stevens</span>, <span class="RsT">Basic Socket
- Interface Extensions for IPv6</span>, <span class="RsR">RFC 2553</span>,
- <span class="RsD">March 1999</span>.</cite></p>
-<p class="Pp"><cite class="Rs"><span class="RsA">W. Stevens</span>,
- <span class="RsA">B. Fenner</span>, and <span class="RsA">A. Rudoff</span>,
- <span class="RsT">UNIX Network Programming, third edition</span>.</cite></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="STANDARDS"><a class="permalink" href="#STANDARDS">STANDARDS</a></h1>
-<p class="Pp">Most of the socket options are defined in RFC 2292 or RFC 2553.
- The <code class="Dv">IPV6_V6ONLY</code> socket option is defined in RFC
- 3542. The <code class="Dv">IPV6_PORTRANGE</code> socket option and the
- conflict resolution rule are not defined in the RFCs and should be
- considered implementation dependent.</p>
-</section>
-</div>
-<table class="foot">
- <tr>
- <td class="foot-date">September 4, 2024</td>
- <td class="foot-os">NetBSD 10.1</td>
- </tr>
-</table>