#include <sys/socket.h> #include <netinet/in.h> s = socket(AF_INET, SOCK_RAW, proto); t = t_open ("/dev/rawip", O_RDWR);
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 to IP. See tcp(7P) and udp(7P) . Direct access may be via the socket interface (using a ‘raw socket’) or the Transport Level Interface (TLI ). The protocol options defined in the IP specification may be set in outgoing datagrams.
The STREAMS driver /dev/rawip is the TLI transport provider that provides raw access to IP .
Raw IP sockets are connectionless and are normally used with the sendto() and recvfrom() calls (see send(3N) and recv(3N) ), although the connect(3N) call may also be used to fix the destination for future datagrams (in which case the read(2) or recv(3N) and write(2) or send(3N) calls may be used). If proto is IPPROTO_RAW or IPPROTO_IGMP , the application is expected to include a complete IP header when sending. Otherwise, that protocol number will be set in outgoing datagrams and used to filter incoming datagrams and an IP header will be generated and prepended to each outgoing datagram. In either case, received datagrams are returned with the IP header and options intact.
The socket options supported at the IP level are:
These options take a struct ip_mreq as the parameter. The structure contains a multicast address which has to be set to the CLASS-D IP multicast address, and an interface address. Normally the interface address is set to INADDR_ANY which causes the kernel to choose the interface to join on.
The multicast socket options can be used with any datagram 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 routing and forwarding by forcing the IP Time To Live field to 1 (meaning that the packet will not be forwarded bu routers).
Raw IP datagrams can also be sent and received using the TLI connectionless primitives.
Datagrams flow through the IP layer in two directions: from the network up 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(7P) .
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 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, and internet timestamp.
The IP layer will normally act as a router (forwarding datagrams that are not addressed to it etc) when the machine has two or more interfaces that are up. This behavior can be overridden by using ndd(1M) to to set the /dev/ip variable ip_forwarding. The value 0 means do not forward, 1 means forward and 2 gives you the default behavior of forwarding when there are two or more "up" interfaces.
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.
Postel, Jon, Internet Protocol - DARPA
Internet Program
Protocol Specification, RFC
791, Network Information Center, SRI
International,
Menlo Park, Calif., September 1981.
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.