IP(4P)

NAME
ip - Internet Protocol

SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>

s = socket(AF_INET, SOCK_RAW, proto);

DESCRIPTION

IP is the internetwork datagram delivery protocol that is central to the Internet protocol family. Programs may use IP through higher-level protocols such as the Transmission Control Protocol (TCP) or the User Datagram Protocol (UDP), or may interface directly using a ``raw socket.'' See tcp(4P) and udp(4P). The protocol options defined in the IP specification may be set in outgoing datagrams.

Raw IP sockets are connectionless and are normally used with the sendto and recvfrom calls, (see send(2) and recv(2)) although the connect(2) call may also be used to fix the destination for future datagrams (in which case the read(2V) or recv(2) and write(2V) or send(2) calls may be used). If proto is zero, the default protocol, IPPROTO_RAW, is used. If proto is non-zero, that protocol number will be set in outgoing datagrams and will be used to filter incoming datagrams. An IP header will be generated and prepended to each outgoing datagram; Received datagrams are returned with the IP header and options intact.

A single socket option, IP_OPTIONS, is supported at the IP level. This socket option may be used to set IP options to be included in each outgoing datagram. IP options to be sent are set with setsockopt (see getsockopt(2)). The getsockopt(2) call returns the IP options set in the last setsockopt call. IP options on received datagrams are visible to user programs only using raw IP sockets. The format of IP options given in setsockopt matches those defined in the IP specification with one exception: the list of addresses for the source routing 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. IP options may be used with any socket type in the Internet family.

At the socket level, the socket option SO_DONTROUTE may be applied. This option forces datagrams being sent to bypass the routing step in output. Normally, IP selects a network interface to send the datagram via, and possibly an intermediate gateway, based on an entry in the routing table. See routing(4N). When SO_DONTROUTE is set, the datagram will be sent via the interface whose network number or full IP address matches the destination address. If no interface matches, the error ENETUNRCH will be returned.

Datagrams flow through the IP layer in two directions: from the network ip to user processes and from user processes down to the network. Using this orientation, IP is layered above the network interface drivers and below the transport protocols such as UDP and TCP. The Internet Control Message Protocol (ICMP) is logically a part of IP. See icmp(4P).

IP provides for a checksum of the header part, but not the data part of the datagram. The checksum value is computed and set in the process of sending datagrams and checked when receiving datagrams. IP header checksumming may be disabled for debugging purposes by patching the kernel variable ipcksum to have the value zero.

IP options in received datagrams are processed in the IP layer according to the protocol specification. Currently recognized IP options include: security, loose source and record route (LSRR), strict source and record route (SSRR), record route, stream identifier, and internet timestamp.

The IP layer will normally forward received datagrams that are not addressed to it. Forwarding is under the control of the kernel variable ipforwarding: if ipforwarding is zero, IP datagrams will not be forwarded; if ipforwarding is one, IP datagrams will be forwarded. ipforwarding is usually set to one only in machines with more than one network interface (internetwork routers). This kernel variable can be patched to enable or disable forwarding.

The IP layer will send an ICMP message back to the source host in many cases when it receives a datagram that can not be handled. A ``time exceeded'' ICMP message will be sent if the ``time to live'' field in the IP header drops to zero in the process of forwarding a datagram. A ``destination unreachable'' message will be sent if a datagram can not be forwarded because there is no route to the final destination, or if it can not be fragmented. If the datagram is addressed to the local host but is destined for a protocol that is not supported or a port that is not in use, a destination unreachable message will also be sent. The IP layer may send an ICMP ``source quench'' message if it is receiving datagrams too quickly. ICMP messages are only sent for the first fragment of a fragmented datagram and are never returned in response to errors in other ICMP messages.

The IP layer supports fragmentation and reassembly. Datagrams are fragmented on output if the datagram is larger than the maximum transmission unit (MTU) of the network interface. Fragments of received datagrams are dropped from the reassembly queues if the complete datagram is not reconstructed within a short time period.

Errors in sending discovered at the network interface driver layer are passed by IP back up to the user process.

ERRORS
A socket operation may fail with one of the following errors returned:

EACCESS
    when specifying an IP broadcast destination address if the caller is not the super-user;

EISCONN
    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;

EMSGSIZE
    when sending datagram that is too large for an interface, but is not allowed be fragmented (such as broadcasts);

ENETUNREACH
    when trying to establish a connection or send a datagram, if there is no matching entry in the routing table, or if an ICMP ``destination unreachable'' message is received.

ENOTCONN
    when trying to send a datagram, but no destination address is specified, and the socket hasn't been connected;

ENOBUFS
    when the system runs out of memory for fragmentation buffers or other internal data structure;

EADDRNOTAVAIL
    when an attempt is made to create a socket with a local address that matches no network interface, or when specifying an IP broadcast destination address and the network interface does not support broadcast;

The following errors may occur when setting or getting IP options:

EINVAL
    An unknown socket option name was given.

EINVAL
    The IP option field was improperly formed; an option field was shorter than the minimum value or longer than the option buffer provided.

SEE ALSO
connect(2), getsockopt(2), read(2V), recv(2), send(2), write(2V), icmp(4P), inet(4F) routing(4N), tcp(4P), udp(4P)

Postel, Jon, ``Internet Protocol - DARPA Internet Program Protocol Specification,'' RFC 791, Network Information Center, SRI International, Menlo Park, Calif., September 1981. (Sun 800-1063-01)

BUGS

Raw sockets should receive ICMP error packets relating to the protocol; currently such packets are simply discarded.

Users of higher-level protocols such as TCP and UDP should be able to see received IP options.