summaryrefslogtreecommitdiff
path: root/static/freebsd/man4/ip.4 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man4/ip.4 3.html')
-rw-r--r--static/freebsd/man4/ip.4 3.html581
1 files changed, 0 insertions, 581 deletions
diff --git a/static/freebsd/man4/ip.4 3.html b/static/freebsd/man4/ip.4 3.html
deleted file mode 100644
index 29442b8d..00000000
--- a/static/freebsd/man4/ip.4 3.html
+++ /dev/null
@@ -1,581 +0,0 @@
-<table class="head">
- <tr>
- <td class="head-ltitle">IP(4)</td>
- <td class="head-vol">Device Drivers Manual</td>
- <td class="head-rtitle">IP(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">ip</code> &#x2014; <span class="Nd">Internet
- Protocol</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/types.h</a>&gt;</code>
- <br/>
- <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_INET</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">IP is the transport layer protocol used by the Internet protocol
- family. Options may be set at the IP level when using higher-level protocols
- that are based on IP (such as TCP and UDP). It may also be accessed through
- a &#x201C;raw socket&#x201D; when developing new protocols, or
- special-purpose applications.</p>
-<p class="Pp">There are several IP-level <a class="Xr">setsockopt(2)</a> and
- <a class="Xr">getsockopt(2)</a> options. <code class="Dv">IP_OPTIONS</code>
- may be used to provide IP options to be transmitted in the IP header of each
- outgoing packet or to examine the header options on incoming packets. IP
- options may be used with any socket type in the Internet family. The format
- of IP options to be sent is that specified by the IP protocol specification
- (RFC-791), with one exception: the list of addresses for Source Route
- options must include the first-hop gateway at the beginning of the list of
- gateways. The first-hop gateway address will be extracted from the option
- list and the size adjusted accordingly before use. To disable previously
- specified options, use a zero-length buffer:</p>
-<div class="Bd Pp Li">
-<pre>setsockopt(s, IPPROTO_IP, IP_OPTIONS, NULL, 0);</pre>
-</div>
-<p class="Pp"><code class="Dv">IP_TOS</code> may be used to set the differential
- service codepoint (DSCP) and the explicit congestion notification (ECN)
- codepoint. Setting the ECN codepoint - the two least significant bits - on a
- socket using a transport protocol implementing ECN has no effect.</p>
-<p class="Pp"><code class="Dv">IP_TTL</code> configures the time-to-live (TTL)
- field in the IP header for <code class="Dv">SOCK_STREAM</code>,
- <code class="Dv">SOCK_DGRAM</code>, and certain types of
- <code class="Dv">SOCK_RAW</code> sockets. For example,</p>
-<div class="Bd Pp Li">
-<pre>int tos = IPTOS_DSCP_EF; /* see &lt;netinet/ip.h&gt; */
-setsockopt(s, IPPROTO_IP, IP_TOS, &amp;tos, sizeof(tos));
-
-int ttl = 60; /* max = 255 */
-setsockopt(s, IPPROTO_IP, IP_TTL, &amp;ttl, sizeof(ttl));</pre>
-</div>
-<p class="Pp"><code class="Dv">IP_IPSEC_POLICY</code> controls IPSec policy for
- sockets. For example,</p>
-<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_IP, IP_IPSEC_POLICY, buf, ipsec_get_policylen(buf));</pre>
-</div>
-<p class="Pp"><code class="Dv">IP_MINTTL</code> may be used to set the minimum
- acceptable TTL a packet must have when received on a socket. All packets
- with a lower TTL are silently dropped. This option is only really useful
- when set to 255, preventing packets from outside the directly connected
- networks reaching local listeners on sockets.</p>
-<p class="Pp"><code class="Dv">IP_DONTFRAG</code> may be used to set the Don't
- Fragment flag on IP packets. Currently this option is respected only on
- <a class="Xr">udp(4)</a> and raw <code class="Nm">ip</code> sockets, unless
- the <code class="Dv">IP_HDRINCL</code> option has been set. On
- <a class="Xr">tcp(4)</a> sockets, the Don't Fragment flag is controlled by
- the Path MTU Discovery option. Sending a packet larger than the MTU size of
- the egress interface, determined by the destination address, returns an
- <code class="Er">EMSGSIZE</code> error.</p>
-<p class="Pp">If the <code class="Dv">IP_ORIGDSTADDR</code> option is enabled on
- a <code class="Dv">SOCK_DGRAM</code> socket, the
- <a class="Xr">recvmsg(2)</a> call will return the destination IP address and
- destination port for a UDP datagram. The <var class="Vt">msg_control</var>
- field in the <var class="Vt">msghdr</var> structure points to a buffer that
- contains a <var class="Vt">cmsghdr</var> structure followed by the
- sockaddr_in structure. The <var class="Vt">cmsghdr</var> fields have the
- following values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(struct sockaddr_in))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_ORIGDSTADDR</pre>
-</div>
-<p class="Pp">If the <code class="Dv">IP_RECVDSTADDR</code> option is enabled on
- a <code class="Dv">SOCK_DGRAM</code> socket, the
- <a class="Xr">recvmsg(2)</a> call will return the destination IP address for
- a UDP datagram. The <var class="Vt">msg_control</var> field in the
- <var class="Vt">msghdr</var> structure points to a buffer that contains a
- <var class="Vt">cmsghdr</var> structure followed by the IP address. The
- <var class="Vt">cmsghdr</var> fields have the following values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(struct in_addr))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_RECVDSTADDR</pre>
-</div>
-<p class="Pp">The source address to be used for outgoing UDP datagrams on a
- socket can be specified as ancillary data with a type code of
- <code class="Dv">IP_SENDSRCADDR</code>. The msg_control field in the msghdr
- structure should point to a buffer that contains a
- <var class="Vt">cmsghdr</var> structure followed by the IP address. The
- cmsghdr fields should have the following values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(struct in_addr))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_SENDSRCADDR</pre>
-</div>
-<p class="Pp">The socket should be either bound to
- <code class="Dv">INADDR_ANY</code> and a local port, and the address
- supplied with <code class="Dv">IP_SENDSRCADDR</code> shouldn't be
- <code class="Dv">INADDR_ANY</code>, or the socket should be bound to a local
- address and the address supplied with <code class="Dv">IP_SENDSRCADDR</code>
- should be <code class="Dv">INADDR_ANY</code>. In the latter case bound
- address is overridden via generic source address selection logic, which
- would choose IP address of interface closest to destination.</p>
-<p class="Pp">For convenience, <code class="Dv">IP_SENDSRCADDR</code> is defined
- to have the same value as <code class="Dv">IP_RECVDSTADDR</code>, so the
- <code class="Dv">IP_RECVDSTADDR</code> control message from
- <a class="Xr">recvmsg(2)</a> can be used directly as a control message for
- <a class="Xr">sendmsg(2)</a>.</p>
-<p class="Pp">If the <code class="Dv">IP_ONESBCAST</code> option is enabled on a
- <code class="Dv">SOCK_DGRAM</code> or a <code class="Dv">SOCK_RAW</code>
- socket, the destination address of outgoing broadcast datagrams on that
- socket will be forced to the undirected broadcast address,
- <code class="Dv">INADDR_BROADCAST</code>, before transmission. This is in
- contrast to the default behavior of the system, which is to transmit
- undirected broadcasts via the first network interface with the
- <code class="Dv">IFF_BROADCAST</code> flag set.</p>
-<p class="Pp">This option allows applications to choose which interface is used
- to transmit an undirected broadcast datagram. For example, the following
- code would force an undirected broadcast to be transmitted via the interface
- configured with the broadcast address 192.168.2.255:</p>
-<div class="Bd Pp Li">
-<pre>char msg[512];
-struct sockaddr_in sin;
-int onesbcast = 1; /* 0 = disable (default), 1 = enable */
-
-setsockopt(s, IPPROTO_IP, IP_ONESBCAST, &amp;onesbcast, sizeof(onesbcast));
-sin.sin_addr.s_addr = inet_addr(&quot;192.168.2.255&quot;);
-sin.sin_port = htons(1234);
-sendto(s, msg, sizeof(msg), 0, &amp;sin, sizeof(sin));</pre>
-</div>
-<p class="Pp">It is the application's responsibility to set the
- <code class="Dv">IP_TTL</code> option to an appropriate value in order to
- prevent broadcast storms. The application must have sufficient credentials
- to set the <code class="Dv">SO_BROADCAST</code> socket level option,
- otherwise the <code class="Dv">IP_ONESBCAST</code> option has no effect.</p>
-<p class="Pp">If the <code class="Dv">IP_BINDANY</code> 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">PRIV_NETINET_BINDANY</code> privilege is needed to set this
- option.</p>
-<p class="Pp">If the <code class="Dv">IP_RECVTTL</code> option is enabled on a
- <code class="Dv">SOCK_DGRAM</code> socket, the <a class="Xr">recvmsg(2)</a>
- call will return the IP TTL (time to live) field for a UDP datagram. The
- msg_control field in the msghdr structure points to a buffer that contains a
- cmsghdr structure followed by the TTL. The cmsghdr fields have the following
- values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(u_char))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_RECVTTL</pre>
-</div>
-<p class="Pp">If the <code class="Dv">IP_RECVTOS</code> option is enabled on a
- <code class="Dv">SOCK_DGRAM</code> socket, the <a class="Xr">recvmsg(2)</a>
- call will return the IP TOS (type of service) field for a UDP datagram. The
- msg_control field in the msghdr structure points to a buffer that contains a
- cmsghdr structure followed by the TOS. The cmsghdr fields have the following
- values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(u_char))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_RECVTOS</pre>
-</div>
-<p class="Pp">If the <code class="Dv">IP_RECVIF</code> option is enabled on a
- <code class="Dv">SOCK_DGRAM</code> socket, the <a class="Xr">recvmsg(2)</a>
- call returns a <var class="Vt">struct sockaddr_dl</var> corresponding to the
- interface on which the packet was received. The
- <var class="Va">msg_control</var> field in the <var class="Vt">msghdr</var>
- structure points to a buffer that contains a <var class="Vt">cmsghdr</var>
- structure followed by the <var class="Vt">struct sockaddr_dl</var>. The
- <var class="Vt">cmsghdr</var> fields have the following values:</p>
-<div class="Bd Pp Li">
-<pre>cmsg_len = CMSG_LEN(sizeof(struct sockaddr_dl))
-cmsg_level = IPPROTO_IP
-cmsg_type = IP_RECVIF</pre>
-</div>
-<p class="Pp"><code class="Dv">IP_PORTRANGE</code> may be used to set the port
- range used for selecting a local port number on a socket with an unspecified
- (zero) port number. It has the following possible values:</p>
-<dl class="Bl-tag">
- <dt id="IP_PORTRANGE_DEFAULT"><a class="permalink" href="#IP_PORTRANGE_DEFAULT"><code class="Dv">IP_PORTRANGE_DEFAULT</code></a></dt>
- <dd>use the default range of values, normally
- <code class="Dv">IPPORT_HIFIRSTAUTO</code> through
- <code class="Dv">IPPORT_HILASTAUTO</code>. This is adjustable through the
- sysctl setting: <var class="Va">net.inet.ip.portrange.first</var> and
- <var class="Va">net.inet.ip.portrange.last</var>.</dd>
- <dt id="IP_PORTRANGE_HIGH"><a class="permalink" href="#IP_PORTRANGE_HIGH"><code class="Dv">IP_PORTRANGE_HIGH</code></a></dt>
- <dd>use a high range of values, normally
- <code class="Dv">IPPORT_HIFIRSTAUTO</code> and
- <code class="Dv">IPPORT_HILASTAUTO</code>. This is adjustable through the
- sysctl setting: <var class="Va">net.inet.ip.portrange.hifirst</var> and
- <var class="Va">net.inet.ip.portrange.hilast</var>.</dd>
- <dt id="IP_PORTRANGE_LOW"><a class="permalink" href="#IP_PORTRANGE_LOW"><code class="Dv">IP_PORTRANGE_LOW</code></a></dt>
- <dd>use a low range of ports, which are normally restricted to privileged
- processes on <span class="Ux">UNIX</span> systems. The range is normally
- from <code class="Dv">IPPORT_RESERVED</code> - 1 down to
- <code class="Li">IPPORT_RESERVEDSTART</code> in descending order. This is
- adjustable through the sysctl setting:
- <var class="Va">net.inet.ip.portrange.lowfirst</var> and
- <var class="Va">net.inet.ip.portrange.lowlast</var>.</dd>
-</dl>
-<p class="Pp">The range of privileged ports which only may be opened by
- root-owned processes may be modified by the
- <var class="Va">net.inet.ip.portrange.reservedlow</var> and
- <var class="Va">net.inet.ip.portrange.reservedhigh</var> sysctl settings.
- The values default to the traditional range, 0 through
- <code class="Dv">IPPORT_RESERVED</code> - 1 (0 through 1023), respectively.
- Note that these settings do not affect and are not accounted for in the use
- or calculation of the other <var class="Va">net.inet.ip.portrange</var>
- values above. Changing these values departs from
- <span class="Ux">UNIX</span> tradition and has security consequences that
- the administrator should carefully evaluate before modifying these
- settings.</p>
-<p class="Pp">Ports are allocated at random within the specified port range in
- order to increase the difficulty of random spoofing attacks. In scenarios
- such as benchmarking, this behavior may be undesirable. In these cases,
- <var class="Va">net.inet.ip.portrange.randomized</var> can be used to toggle
- randomization off.</p>
-<section class="Ss">
-<h2 class="Ss" id="Multicast_Options"><a class="permalink" href="#Multicast_Options">Multicast
- Options</a></h2>
-<p class="Pp">IP multicasting is supported only on
- <code class="Dv">AF_INET</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.</p>
-<p class="Pp">The <code class="Dv">IP_MULTICAST_TTL</code> option changes the
- time-to-live (TTL) for outgoing multicast datagrams in order to control the
- scope of the multicasts:</p>
-<div class="Bd Pp Li">
-<pre>u_char ttl; /* range: 0 to 255, default = 1 */
-setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &amp;ttl, sizeof(ttl));</pre>
-</div>
-<p class="Pp">Datagrams with a TTL of 1 are not forwarded beyond the local
- network. Multicast datagrams with a TTL of 0 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 has not been disabled on the
- sending socket (see below). Multicast datagrams with TTL greater than 1 may
- be forwarded to other networks if a multicast router is attached to the
- local network.</p>
-<p class="Pp">For hosts with multiple interfaces, where an interface has not
- been specified for a multicast group membership, each multicast transmission
- is sent from the primary network interface. The
- <code class="Dv">IP_MULTICAST_IF</code> option overrides the default for
- subsequent transmissions from a given socket:</p>
-<div class="Bd Pp Li">
-<pre>struct in_addr addr;
-setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &amp;addr, sizeof(addr));</pre>
-</div>
-<p class="Pp">where &quot;addr&quot; is the local IP address of the desired
- interface or <code class="Dv">INADDR_ANY</code> to specify the default
- interface.</p>
-<p class="Pp">To specify an interface by index, an instance of
- <var class="Vt">ip_mreqn</var> may be passed instead. The
- <var class="Vt">imr_ifindex</var> member should be set to the index of the
- desired interface, or 0 to specify the default interface. The kernel
- differentiates between these two structures by their size.</p>
-<p class="Pp">The use of <var class="Vt">IP_MULTICAST_IF</var> is
- <i class="Em">not recommended</i>, as multicast memberships are scoped to
- each individual interface. It is supported for legacy use only by
- applications, such as routing daemons, which expect to be able to transmit
- link-local IPv4 multicast datagrams (224.0.0.0/24) on multiple interfaces,
- without requesting an individual membership for each interface.</p>
-<p class="Pp">An interface's local IP address and multicast capability can be
- obtained via the <code class="Dv">SIOCGIFCONF</code> and
- <code class="Dv">SIOCGIFFLAGS</code> ioctls. Normal applications should not
- need to use this option.</p>
-<p class="Pp">If a multicast datagram is sent to a group to which the sending
- host itself belongs (on the outgoing interface), a copy of the datagram is,
- by default, looped back by the IP layer for local delivery. The
- <code class="Dv">IP_MULTICAST_LOOP</code> option gives the sender explicit
- control over whether or not subsequent datagrams are looped back:</p>
-<div class="Bd Pp Li">
-<pre>u_char loop; /* 0 = disable, 1 = enable (default) */
-setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &amp;loop, sizeof(loop));</pre>
-</div>
-<p class="Pp">This option improves performance for applications that may have no
- more than one instance on a single host (such as a routing 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">The sysctl setting <var class="Va">net.inet.ip.mcast.loop</var>
- controls the default setting of the
- <code class="Dv">IP_MULTICAST_LOOP</code> socket option for new sockets.</p>
-<p class="Pp">A multicast datagram sent with an initial TTL 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 loopback control option has no effect on such delivery.</p>
-<p class="Pp">A host must become a member of a multicast group before it can
- receive datagrams sent to the group. To join a multicast group, use the
- <code class="Dv">IP_ADD_MEMBERSHIP</code> option:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreqn mreqn;
-setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &amp;mreqn, sizeof(mreqn));</pre>
-</div>
-<p class="Pp">where <var class="Fa">mreqn</var> is the following structure:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreqn {
- struct in_addr imr_multiaddr; /* IP multicast address of group */
- struct in_addr imr_address; /* local IP address of interface */
- int imr_ifindex; /* interface index */
-}</pre>
-</div>
-<p class="Pp"><var class="Va">imr_ifindex</var> should be set to the index of a
- particular multicast-capable interface if the host is multihomed. If
- <var class="Va">imr_ifindex</var> is non-zero, value of
- <var class="Va">imr_interface</var> is ignored. Otherwise, if
- <var class="Va">imr_ifindex</var> is 0, kernel will use IP address from
- <var class="Va">imr_interface</var> to lookup the interface. Value of
- <var class="Va">imr_interface</var> may be set to
- <var class="Va">INADDR_ANY</var> to choose the default interface, although
- this is not recommended; this is considered to be the first interface
- corresponding to the default route. Otherwise, the first multicast-capable
- interface configured in the system will be used.</p>
-<p class="Pp">Legacy <var class="Vt">struct ip_mreq</var>, that lacks
- <var class="Va">imr_ifindex</var> field is also supported by
- <code class="Dv">IP_ADD_MEMBERSHIP</code> setsockopt. In this case kernel
- would behave as if <var class="Va">imr_ifindex</var> was set to zero:
- <var class="Va">imr_interface</var> will be used to lookup interface.</p>
-<p class="Pp">Prior to <span class="Ux">FreeBSD 7.0</span>, if the
- <var class="Va">imr_interface</var> member is within the network range
- <code class="Li">0.0.0.0/8</code>, it is treated as an interface index in
- the system interface MIB, as per the RIP Version 2 MIB Extension (RFC-1724).
- In versions of <span class="Ux">FreeBSD</span> since 7.0, this behavior is
- no longer supported. Developers should instead use the RFC 3678 multicast
- source filter APIs; in particular,
- <code class="Dv">MCAST_JOIN_GROUP</code>.</p>
-<p class="Pp">Up to <code class="Dv">IP_MAX_MEMBERSHIPS</code> memberships may
- be added on a single socket. 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">To drop a membership, use:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq mreq;
-setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, &amp;mreq, sizeof(mreq));</pre>
-</div>
-<p class="Pp">where <var class="Fa">mreq</var> contains the same values as used
- to add the membership. Memberships are dropped when the socket is closed or
- the process exits.</p>
-<p class="Pp">The IGMP protocol uses the primary IP address of the interface as
- its identifier for group membership. This is the first IP address configured
- on the interface. If this address is removed or changed, the results are
- undefined, as the IGMP membership state will then be inconsistent. If
- multiple IP aliases are configured on the same interface, they will be
- ignored.</p>
-<p class="Pp">This shortcoming was addressed in IPv6; MLDv2 requires that the
- unique link-local address for an interface is used to identify an MLDv2
- listener.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Source-Specific_Multicast_Options"><a class="permalink" href="#Source-Specific_Multicast_Options">Source-Specific
- Multicast Options</a></h2>
-<p class="Pp">Since <span class="Ux">FreeBSD 8.0</span>, the use of
- Source-Specific Multicast (SSM) is supported. These extensions require an
- IGMPv3 multicast router in order to make best use of them. If a legacy
- multicast router is present on the link, <span class="Ux">FreeBSD</span>
- will simply downgrade to the version of IGMP spoken by the router, and the
- benefits of source filtering on the upstream link will not be present,
- although the kernel will continue to squelch transmissions from blocked
- sources.</p>
-<p class="Pp">Each group membership on a socket now has a filter mode:</p>
-<dl class="Bl-tag">
- <dt id="MCAST_EXCLUDE"><a class="permalink" href="#MCAST_EXCLUDE"><code class="Dv">MCAST_EXCLUDE</code></a></dt>
- <dd>Datagrams sent to this group are accepted, unless the source is in a list
- of blocked source addresses.</dd>
- <dt id="MCAST_INCLUDE"><a class="permalink" href="#MCAST_INCLUDE"><code class="Dv">MCAST_INCLUDE</code></a></dt>
- <dd>Datagrams sent to this group are accepted only if the source is in a list
- of accepted source addresses.</dd>
-</dl>
-<p class="Pp" id="delta-based">Groups joined using the legacy
- <code class="Dv">IP_ADD_MEMBERSHIP</code> option are placed in
- exclusive-mode, and are able to request that certain sources are blocked or
- allowed. This is known as the
- <a class="permalink" href="#delta-based"><i class="Em">delta-based
- API</i></a>.</p>
-<p class="Pp">To block a multicast source on an existing group membership:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq_source mreqs;
-setsockopt(s, IPPROTO_IP, IP_BLOCK_SOURCE, &amp;mreqs, sizeof(mreqs));</pre>
-</div>
-<p class="Pp">where <var class="Fa">mreqs</var> is the following structure:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq_source {
- struct in_addr imr_multiaddr; /* IP multicast address of group */
- struct in_addr imr_sourceaddr; /* IP address of source */
- struct in_addr imr_interface; /* local IP address of interface */
-}</pre>
-</div>
-<var class="Va">imr_sourceaddr</var> should be set to the address of the source
- to be blocked.
-<p class="Pp">To unblock a multicast source on an existing group:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq_source mreqs;
-setsockopt(s, IPPROTO_IP, IP_UNBLOCK_SOURCE, &amp;mreqs, sizeof(mreqs));</pre>
-</div>
-<p class="Pp">The <code class="Dv">IP_BLOCK_SOURCE</code> and
- <code class="Dv">IP_UNBLOCK_SOURCE</code> options are <i class="Em">not
- permitted</i> for inclusive-mode group memberships.</p>
-<p class="Pp">To join a multicast group in <code class="Dv">MCAST_INCLUDE</code>
- mode with a single source, or add another source to an existing
- inclusive-mode membership:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq_source mreqs;
-setsockopt(s, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, &amp;mreqs, sizeof(mreqs));</pre>
-</div>
-<p class="Pp">To leave a single source from an existing group in inclusive
- mode:</p>
-<div class="Bd Pp Li">
-<pre>struct ip_mreq_source mreqs;
-setsockopt(s, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, &amp;mreqs, sizeof(mreqs));</pre>
-</div>
-If this is the last accepted source for the group, the membership will be
- dropped.
-<p class="Pp" id="full-state">The
- <code class="Dv">IP_ADD_SOURCE_MEMBERSHIP</code> and
- <code class="Dv">IP_DROP_SOURCE_MEMBERSHIP</code> options are
- <i class="Em">not accepted</i> for exclusive-mode group memberships.
- However, both exclusive and inclusive mode memberships support the use of
- the <a class="permalink" href="#full-state"><i class="Em">full-state
- API</i></a> documented in RFC 3678. For management of source filter lists
- using this API, please refer to <a class="Xr">sourcefilter(3)</a>.</p>
-<p class="Pp">The sysctl settings
- <var class="Va">net.inet.ip.mcast.maxsocksrc</var> and
- <var class="Va">net.inet.ip.mcast.maxgrpsrc</var> are used to specify an
- upper limit on the number of per-socket and per-group source filter entries
- which the kernel may allocate.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Raw_IP_Sockets"><a class="permalink" href="#Raw_IP_Sockets">Raw
- IP Sockets</a></h2>
-<p class="Pp">Raw IP sockets are connectionless, and are normally used with the
- <a class="Xr">sendto(2)</a> and <a class="Xr">recvfrom(2)</a> calls, though
- the <a class="Xr">connect(2)</a> call may also be used to fix the
- destination for future packets (in which case the <a class="Xr">read(2)</a>
- or <a class="Xr">recv(2)</a> and <a class="Xr">write(2)</a> or
- <a class="Xr">send(2)</a> system calls may be used).</p>
-<p class="Pp">If <var class="Fa">proto</var> is 0, the default protocol
- <code class="Dv">IPPROTO_RAW</code> is used for outgoing packets, and only
- incoming packets destined for that protocol are received. If
- <var class="Fa">proto</var> is non-zero, that protocol number will be used
- on outgoing packets and to filter incoming packets.</p>
-<p class="Pp">Outgoing packets automatically have an IP header prepended to them
- (based on the destination address and the protocol number the socket is
- created with), unless the <code class="Dv">IP_HDRINCL</code> option has been
- set. Unlike in previous <span class="Ux">BSD</span> releases, incoming
- packets are received with IP header and options intact, leaving all fields
- in network byte order.</p>
-<p class="Pp"><code class="Dv">IP_HDRINCL</code> indicates the complete IP
- header is included with the data and may be used only with the
- <code class="Dv">SOCK_RAW</code> type.</p>
-<div class="Bd Pp Li">
-<pre>#include &lt;netinet/in_systm.h&gt;
-#include &lt;netinet/ip.h&gt;
-
-int hincl = 1; /* 1 = on, 0 = off */
-setsockopt(s, IPPROTO_IP, IP_HDRINCL, &amp;hincl, sizeof(hincl));</pre>
-</div>
-<p class="Pp">Unlike previous <span class="Ux">BSD</span> releases, the program
- must set all the fields of the IP header, including the following:</p>
-<div class="Bd Pp Li">
-<pre>ip-&gt;ip_v = IPVERSION;
-ip-&gt;ip_hl = hlen &gt;&gt; 2;
-ip-&gt;ip_id = 0; /* 0 means kernel set appropriate value */
-ip-&gt;ip_off = htons(offset);
-ip-&gt;ip_len = htons(len);</pre>
-</div>
-<p class="Pp">The packet should be provided as is to be sent over wire. This
- implies all fields, including <var class="Va">ip_len</var> and
- <var class="Va">ip_off</var> to be in network byte order. See
- <a class="Xr">byteorder(3)</a> for more information on network byte order.
- If the <var class="Va">ip_id</var> field is set to 0 then the kernel will
- choose an appropriate value. If the header source address is set to
- <code class="Dv">INADDR_ANY</code>, the kernel will choose an appropriate
- address.</p>
-</section>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1>
-<p class="Pp">A socket operation may fail with one of the following errors
- returned:</p>
-<dl class="Bl-tag">
- <dt id="EISCONN">[<a class="permalink" href="#EISCONN"><code class="Er">EISCONN</code></a>]</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 id="ENOTCONN">[<a class="permalink" href="#ENOTCONN"><code class="Er">ENOTCONN</code></a>]</dt>
- <dd>when trying to send a datagram, but no destination address is specified,
- and the socket has not been connected;</dd>
- <dt id="ENOBUFS">[<a class="permalink" href="#ENOBUFS"><code class="Er">ENOBUFS</code></a>]</dt>
- <dd>when the system runs out of memory for an internal data structure;</dd>
- <dt id="EADDRNOTAVAIL">[<a class="permalink" href="#EADDRNOTAVAIL"><code class="Er">EADDRNOTAVAIL</code></a>]</dt>
- <dd>when an attempt is made to create a socket with a network address for
- which no network interface exists.</dd>
- <dt id="EACCES">[<a class="permalink" href="#EACCES"><code class="Er">EACCES</code></a>]</dt>
- <dd>when an attempt is made to create a raw IP socket by a non-privileged
- process.</dd>
-</dl>
-<p class="Pp">The following errors specific to IP may occur when setting or
- getting IP options:</p>
-<dl class="Bl-tag">
- <dt id="EINVAL">[<a class="permalink" href="#EINVAL"><code class="Er">EINVAL</code></a>]</dt>
- <dd>An unknown socket option name was given.</dd>
- <dt id="EINVAL~2">[<a class="permalink" href="#EINVAL~2"><code class="Er">EINVAL</code></a>]</dt>
- <dd>The IP option field was improperly formed; an option field was shorter
- than the minimum value or longer than the option buffer provided.</dd>
-</dl>
-<p class="Pp">The following errors may occur when attempting to send IP
- datagrams via a &#x201C;raw socket&#x201D; with the
- <code class="Dv">IP_HDRINCL</code> option set:</p>
-<dl class="Bl-tag">
- <dt id="EINVAL~3">[<a class="permalink" href="#EINVAL~3"><code class="Er">EINVAL</code></a>]</dt>
- <dd>The user-supplied <var class="Va">ip_len</var> field was not equal to the
- length of the datagram written to the socket.</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">byteorder(3)</a>,
- <a class="Xr">CMSG_DATA(3)</a>, <a class="Xr">sourcefilter(3)</a>,
- <a class="Xr">icmp(4)</a>, <a class="Xr">igmp(4)</a>,
- <a class="Xr">inet(4)</a>, <a class="Xr">intro(4)</a>,
- <a class="Xr">multicast(4)</a></p>
-<p class="Pp"><cite class="Rs"><span class="RsA">D. Thaler</span>,
- <span class="RsA">B. Fenner</span>, and <span class="RsA">B. Quinn</span>,
- <span class="RsT">Socket Interface Extensions for Multicast Source
- Filters</span>, <span class="RsN">RFC 3678</span>, <span class="RsD">Jan
- 2004</span>.</cite></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
-<p class="Pp">The <code class="Nm">ip</code> protocol appeared in
- <span class="Ux">4.2BSD</span>. The <var class="Vt">ip_mreqn</var> structure
- appeared in Linux 2.4.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="BUGS"><a class="permalink" href="#BUGS">BUGS</a></h1>
-<p class="Pp">Before <span class="Ux">FreeBSD 10.0</span> packets received on
- raw IP sockets had the <var class="Va">ip_hl</var> subtracted from the
- <var class="Va">ip_len</var> field.</p>
-<p class="Pp">Before <span class="Ux">FreeBSD 11.0</span> packets received on
- raw IP sockets had the <var class="Va">ip_len</var> and
- <var class="Va">ip_off</var> fields converted to host byte order. Packets
- written to raw IP sockets were expected to have <var class="Va">ip_len</var>
- and <var class="Va">ip_off</var> in host byte order.</p>
-</section>
-</div>
-<table class="foot">
- <tr>
- <td class="foot-date">August 9, 2021</td>
- <td class="foot-os">FreeBSD 15.0</td>
- </tr>
-</table>