diff options
Diffstat (limited to 'man7/ip.7')
-rw-r--r-- | man7/ip.7 | 921 |
1 files changed, 921 insertions, 0 deletions
diff --git a/man7/ip.7 b/man7/ip.7 new file mode 100644 index 000000000..6d2f4ce79 --- /dev/null +++ b/man7/ip.7 @@ -0,0 +1,921 @@ +'\" t +.\" Don't change the line above. it tells man that tbl is needed. +.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>. +.\" Permission is granted to distribute possibly modified copies +.\" of this page provided the header is included verbatim, +.\" and in case of nontrivial modification author and date +.\" of the modification is added to the header. +.\" $Id: ip.7,v 1.19 2000/12/20 18:10:31 ak Exp $ +.TH IP 7 2001-06-19 "Linux Man Page" "Linux Programmer's Manual" +.SH NAME +ip \- Linux IPv4 protocol implementation +.SH SYNOPSIS +.B #include <sys/socket.h> +.br +.\" .B #include <net/netinet.h> -- does not exist anymore +.\" .B #include <linux/errqueue.h> -- never include <linux/foo.h> +.B #include <netinet/in.h> +.br +.B #include <netinet/ip.h> \fR/* superset of previous */ +.sp +.IB tcp_socket " = socket(PF_INET, SOCK_STREAM, 0);" +.br +.IB raw_socket " = socket(PF_INET, SOCK_RAW, " protocol ");" +.br +.IB udp_socket " = socket(PF_INET, SOCK_DGRAM, " protocol ");" +.SH DESCRIPTION +Linux implements the Internet Protocol, version 4, +described in RFC791 and RFC1122. +.B ip +contains a level 2 +multicasting implementation conforming to RFC1112. It also contains an IP +router including a packet filter. +.\" XXX: has someone verified that 2.1 is really 1812 compliant? +.PP +The programmer's interface is BSD sockets compatible. +For more information on sockets, see +.BR socket (7). +.PP +An IP socket is created by calling the +.BR socket (2) +function as +.BR "socket(PF_INET, socket_type, protocol)" . +Valid socket types are +.B SOCK_STREAM +to open a +.BR tcp (7) +socket, +.B SOCK_DGRAM +to open a +.BR udp (7) +socket, or +.B SOCK_RAW +to open a +.BR raw (7) +socket to access the IP protocol directly. +.I protocol +is the IP protocol in the IP header to be received or sent. The only valid +values for +.I protocol +are +.B 0 +and +.B IPPROTO_TCP +for TCP sockets and +.B 0 +and +.B IPPROTO_UDP +for UDP sockets. For +.B SOCK_RAW +you may specify +a valid IANA IP protocol defined in +RFC1700 +assigned numbers. +.PP +.\" XXX ip current does an autobind in listen, but I'm not sure if that should +.\" be documented. +When a process wants to receive new incoming packets or connections, it +should bind a socket to a local interface address using +.BR bind (2). +Only one IP socket may be bound to any given local (address, port) pair. +When +.B INADDR_ANY +is specified in the bind call the socket will be bound to +.I all +local interfaces. When +.BR listen (2) +or +.BR connect (2) +are called on a unbound socket the socket is automatically bound to a +random free port with the local address set to +.BR INADDR_ANY . + +A TCP local socket address that has been bound is unavailable for some time after closing, +unless the +.B SO_REUSEADDR +flag has been set. Care should be taken when using this flag as it +makes TCP less reliable. + +.SH "ADDRESS FORMAT" +An IP socket address is defined as a combination of an IP interface address +and a port number. The basic IP protocol does not supply port numbers, they +are implemented by higher level protocols like +.BR udp (7) +and +.BR tcp (7). +On raw sockets +.B sin_port +is set to the IP protocol. + +.PP +.RS +.nf +.ta 4n 19n 31n +struct sockaddr_in { + sa_family_t sin_family; /* address family: AF_INET */ + u_int16_t sin_port; /* port in network byte order */ + struct in_addr sin_addr; /* internet address */ +}; + +/* Internet address. */ +struct in_addr { + u_int32_t s_addr; /* address in network byte order */ +}; +.ta +.fi +.RE +.PP +.I sin_family +is always set to +.BR AF_INET . +This is required; in Linux 2.2 most networking functions return +.B EINVAL +when this setting is missing. +.I sin_port +contains the port in network byte order. The port numbers below 1024 are called +.IR "reserved ports" . +Only processes with effective user id 0 or the +.B CAP_NET_BIND_SERVICE +capability may +.BR bind (2) +to these sockets. Note that the raw IPv4 protocol as such has no concept of a +port, they are only implemented by higher protocols like +.BR tcp (7) +and +.BR udp (7). +.PP +.I sin_addr +is the IP host address. +The +.I addr +member of +.B struct in_addr +contains the host interface address in network order. +.B in_addr +should be only accessed using the +.BR inet_aton (3), +.BR inet_addr (3), +.BR inet_makeaddr (3) +library functions or directly with the name resolver (see +.BR gethostbyname (3)). +IPv4 addresses are divided into unicast, broadcast +and multicast addresses. Unicast addresses specify a single interface of a host, +broadcast addresses specify all hosts on a network and multicast addresses +address all hosts in a multicast group. Datagrams to broadcast addresses +can be only sent or received when the +.B SO_BROADCAST +socket flag is set. +In the current implementation connection oriented sockets are only allowed +to use unicast addresses. +.\" Leave a loophole for XTP @) + +Note that the address and the port are always stored in network order. +In particular, this means that you need to call +.BR htons (3) +on the number that is assigned to a port. All address/port manipulation +functions in the standard library work in network order. + +There are several special addresses: +.B INADDR_LOOPBACK +(127.0.0.1) +always refers to the local host via the loopback device; +.B INADDR_ANY +(0.0.0.0) +means any address for binding; +.B INADDR_BROADCAST +(255.255.255.255) +means any host and has the same effect on bind as +.B INADDR_ANY +for historical reasons. + +.SH "SOCKET OPTIONS" + +IP supports some protocol specific socket options that can be set with +.BR setsockopt (2) +and read with +.BR getsockopt (2). +The socket option level for IP is +.BR SOL_IP . +A boolean integer flag is zero when it is false, otherwise true. + +.TP +.B IP_OPTIONS +Sets or get the IP options to be sent with every packet from this +socket. The arguments are a pointer to a memory buffer containing the options +and the option length. +The +.BR setsockopt (2) +call sets the IP options associated with a socket. +The maximum option size for IPv4 is 40 bytes. See RFC791 for the allowed +options. When the initial connection request packet for a +.B SOCK_STREAM +socket contains IP options, the IP options will be set automatically +to the options from the initial packet with routing headers reversed. +Incoming packets are not allowed to change options after the connection +is established. +The processing of all incoming source routing options +is disabled by default and can be enabled by using the +.B accept_source_route +sysctl. Other options like timestamps are still handled. +For datagram sockets, IP options can be only set by the local user. +Calling +.BR getsockopt (2) +with +.I IP_OPTIONS +puts the current IP options used for sending into the supplied buffer. + +.TP +.B IP_PKTINFO +Pass an +.I IP_PKTINFO +ancillary message that contains a +.B pktinfo +structure that supplies some information about the incoming packet. +This only works for datagram oriented sockets. +The argument is a flag that tells the socket whether the IP_PKTINFO message +should be passed or not. The message itself can only be sent/retrieved +as control message with a packet using +.BR recvmsg (2) +or +.BR sendmsg (2). + +.IP +.RS +.ta 4n 19n 33n +.nf +struct in_pktinfo { + unsigned int ipi_ifindex; /* Interface index */ + struct in_addr ipi_spec_dst; /* Local address */ + struct in_addr ipi_addr; /* Header Destination address */ +}; +.fi +.RE +.IP +.\" XXX elaborate on that. +.B ipi_ifindex +is the unique index of the interface the packet was received on. +.B ipi_spec_dst +is the local address of the packet and +.B ipi_addr +is the destination address in the packet header. +If +.I IP_PKTINFO +is passed to +.BR sendmsg (2) +and +.\" This field is grossly misnamed +.B ipi_spec_dst +is not zero, then it is used as the local source address for the routing +table lookup and for setting up IP source route options. +When +.B ipi_ifindex +is not zero the primary local address of the interface specified by the +index overwrites +.I ipi_spec_dst +for the routing table lookup. +.TP +.B IP_RECVTOS +If enabled the +.I IP_TOS +ancillary message is passed with incoming packets. It contains a byte which +specifies the Type of Service/Precedence field of the packet header. +Expects a boolean integer flag. + +.TP +.B IP_RECVTTL +When this flag is set +pass a +.I IP_RECVTTL +control message with the time to live +field of the received packet as a byte. Not supported for +.B SOCK_STREAM +sockets. + +.TP +.B IP_RECVOPTS +Pass all incoming IP options to the user in a +.I IP_OPTIONS +control message. The routing header and other options are already filled in +for the local host. Not supported for +.I SOCK_STREAM +sockets. + +.TP +.B IP_RETOPTS +Identical to +.I IP_RECVOPTS +but returns raw unprocessed options with timestamp and route record +options not filled in for this hop. + +.TP +.B IP_TOS +Set or receive the Type-Of-Service (TOS) field that is sent with every IP packet +originating from this socket. It is used to prioritize packets on the network. +TOS is a byte. There are some standard TOS flags defined: +.B IPTOS_LOWDELAY +to minimize delays for interactive traffic, +.B IPTOS_THROUGHPUT +to optimize throughput, +.B IPTOS_RELIABILITY +to optimize for reliability, +.B IPTOS_MINCOST +should be used for "filler data" where slow transmission doesn't matter. +At most one of these TOS values can be specified. Other bits are invalid and +shall be cleared. +Linux sends +.B IPTOS_LOWDELAY +datagrams first by default, +but the exact behaviour depends on the configured queueing discipline. +.\" XXX elaborate on this +Some high priority levels may require an effective user id of 0 or the +.B CAP_NET_ADMIN +capability. +The priority can also be set in a protocol independent way by the +.RB ( SOL_SOCKET ", " SO_PRIORITY ) +socket option (see +.BR socket (7)). + +.TP +.B IP_TTL +Set or retrieve the current time to live field that is send in every packet +send from this socket. + +.TP +.B IP_HDRINCL +If enabled +the user supplies an ip header in front of the user data. Only valid +for +.B SOCK_RAW +sockets. See +.BR raw (7) +for more information. When this flag is enabled the values set by +.IR IP_OPTIONS , +.I IP_TTL +and +.I IP_TOS +are ignored. + +.TP +.BR IP_RECVERR " (defined in <linux/errqueue.h>)" +Enable extended reliable error message passing. +When enabled on a datagram socket all +generated errors will be queued in a per-socket error queue. When the user +receives an error from a socket operation the errors can +be received by calling +.BR recvmsg (2) +with the +.B MSG_ERRQUEUE +flag set. The +.B sock_extended_err +structure describing the error will be passed in a ancillary message with +the type +.I IP_RECVERR +and the level +.BR SOL_IP . +This is useful for reliable error handling on unconnected sockets. +The received data portion of the error queue +contains the error packet. +.IP +The +.I IP_RECVERR +control message contains a +.B sock_extended_err +structure: +.IP +.RS +.ne 18 +.nf +.ta 4n 20n 32n +#define SO_EE_ORIGIN_NONE 0 +#define SO_EE_ORIGIN_LOCAL 1 +#define SO_EE_ORIGIN_ICMP 2 +#define SO_EE_ORIGIN_ICMP6 3 + +struct sock_extended_err { + u_int32_t ee_errno; /* error number */ + u_int8_t ee_origin; /* where the error originated */ + u_int8_t ee_type; /* type */ + u_int8_t ee_code; /* code */ + u_int8_t ee_pad; + u_int32_t ee_info; /* additional information */ + u_int32_t ee_data; /* other data */ + /* More data may follow */ +}; + +struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *); +.ta +.fi +.RE +.IP +.B ee_errno +contains the errno number of the queued error. +.B ee_origin +is the origin code of where the error originated. +The other fields are protocol specific. The macro +.B SO_EE_OFFENDER +returns a pointer to the address of the network object +where the error originated from given a pointer to the ancillary message. +If this address is not known, the +.I sa_family +member of the +.B sockaddr +contains +.B AF_UNSPEC +and the other fields of the +.B sockaddr +are undefined. +.IP +IP uses the +.B sock_extended_err +structure as follows: +.I ee_origin +is set to +.B SO_EE_ORIGIN_ICMP +for errors received as an ICMP packet, or +.B SO_EE_ORIGIN_LOCAL +for locally generated errors. Unknown values should be ignored. +.I ee_type +and +.I ee_code +are set from the type and code fields of the ICMP header. +.I ee_info +contains the discovered MTU for +.B EMSGSIZE +errors. The message also contains the +.I sockaddr_in of the node +caused the error, which can be accessed with the +.B SO_EE_OFFENDER +macro. The +.I sin_family +field of the SO_EE_OFFENDER address is +.I AF_UNSPEC +when the source was unknown. +When the error originated from the network, all IP options +.RI ( IP_OPTIONS ", " IP_TTL ", " +etc.) enabled on the socket and contained in the +error packet are passed as control messages. The payload of the packet +causing the error is returned as normal payload. +.\" XXX: is it a good idea to document that? It is a dubious feature. +.\" On +.\" .B SOCK_STREAM +.\" sockets, +.\" .I IP_RECVERR +.\" has slightly different semantics. Instead of +.\" saving the errors for the next timeout, it passes all incoming errors +.\" immediately to the +.\" user. This might be useful for very short-lived TCP connections which +.\" need fast error handling. Use this option with care: it makes TCP unreliable +.\" by not allowing it to recover properly from routing shifts and other normal +.\" conditions and breaks the protocol specification. +Note that TCP has no error queue; +.B MSG_ERRQUEUE +is illegal on +.B SOCK_STREAM +sockets. +Thus all errors are returned by socket function return or +.B SO_ERROR +only. +.IP +For raw sockets, +.I IP_RECVERR +enables passing of all received ICMP errors to the +application, otherwise errors are only reported on connected sockets +.IP +It sets or retrieves an integer boolean flag. +.I IP_RECVERR +defaults to off. + +.TP +.B IP_MTU_DISCOVER +Sets or receives the Path MTU Discovery setting +for a socket. When enabled, Linux will perform Path MTU Discovery +as defined in RFC1191 +on this socket. The don't fragment flag is set on all outgoing datagrams. +The system-wide default is controlled by the +.B ip_no_pmtu_disc +sysctl for +.B SOCK_STREAM +sockets, and disabled on all others. For non +.B SOCK_STREAM +sockets it is the user's responsibility to packetize the data +in MTU sized chunks and to do the retransmits if necessary. +The kernel will reject packets that are bigger than the known +path MTU if this flag is set (with +.B EMSGSIZE +). + +.TS +tab(:); +c l +l l. +Path MTU discovery flags:Meaning +IP_PMTUDISC_WANT:Use per-route settings. +IP_PMTUDISC_DONT:Never do Path MTU Discovery. +IP_PMTUDISC_DO:Always do Path MTU Discovery. +.TE + + +When PMTU discovery is enabled the kernel automatically keeps track of +the path MTU per destination host. +When it is connected to a specific peer with +.BR connect (2) +the currently known path MTU can be retrieved conveniently using the +.B IP_MTU +socket option (e.g. after a +.B EMSGSIZE +error occurred). It may change over time. +For connectionless sockets with many destinations +the new also MTU for a given destination can also be accessed using the +error queue (see +.BR IP_RECVERR ). +A new error will be queued for every incoming MTU update. + +While MTU discovery is in progress initial packets from datagram sockets +may be dropped. Applications using UDP should be aware of this and not +take it into account for their packet retransmit strategy. + +To bootstrap the path MTU discovery process on unconnected sockets it +is possible to start with a big datagram size +(up to 64K-headers bytes long) and let it shrink by updates of the path MTU. +.\" XXX this is an ugly hack + +To get an initial estimate of the +path MTU connect a datagram socket to the destination address using +.BR connect (2) +and retrieve the MTU by calling +.BR getsockopt (2) +with the +.B IP_MTU +option. + +.TP +.B IP_MTU +Retrieve the current known path MTU of the current socket. +Only valid when the socket has been connected. Returns an integer. Only valid +as a +.BR getsockopt (2). +.\" +.TP +.B IP_ROUTER_ALERT +Pass all to-be forwarded packets with the +IP Router Alert +option +set to this socket. Only valid for raw sockets. This is useful, for instance, for user +space RSVP daemons. The tapped packets are not forwarded by the kernel, it is +the users responsibility to send them out again. Socket binding is ignored, +such packets are only filtered by protocol. +Expects an integer flag. +.\" +.TP +.B IP_MULTICAST_TTL +Set or reads the time-to-live value of outgoing multicast packets for this +socket. It is +very important for multicast packets to set the smallest TTL possible. +The default is 1 which means that multicast packets don't leave the local +network unless the user program explicitly requests it. Argument is an +integer. +.\" +.TP +.B IP_MULTICAST_LOOP +Sets or reads a boolean integer argument whether sent multicast packets should be +looped back to the local sockets. +.\" +.TP +.B IP_ADD_MEMBERSHIP +Join a multicast group. Argument is a +.B struct ip_mreqn +structure. +.PP +.RS +.nf +.ta 4n 19n 34n +struct ip_mreqn { + struct in_addr imr_multiaddr; /* IP multicast group address */ + struct in_addr imr_address; /* IP address of local interface */ + int imr_ifindex; /* interface index */ +}; +.fi +.RE +.IP +.I imr_multiaddr +contains the address of the multicast group the application wants to join or leave. +It must be a valid multicast address. +.I imr_address +is the address of the local interface with which the system should join the multicast +group; if it is equal to +.B INADDR_ANY +an appropriate interface is chosen by the system. +.I imr_ifindex +is the interface index of the interface that should join/leave the +.I imr_multiaddr +group, or 0 to indicate any interface. +.IP +For compatibility, the old +.B ip_mreq +structure is still supported. It differs from +.B ip_mreqn +only by not including +the +.I imr_ifindex +field. Only valid as a +.BR setsockopt (2). +.\" +.TP +.B IP_DROP_MEMBERSHIP +Leave a multicast group. Argument is an +.B ip_mreqn +or +.B ip_mreq +structure similar to +.IR IP_ADD_MEMBERSHIP . +.\" +.TP +.B IP_MULTICAST_IF +Set the local device for a multicast socket. Argument is an +.B ip_mreqn +or +.B ip_mreq +structure similar to +.IR IP_ADD_MEMBERSHIP . +.IP +When an invalid socket option is passed, +.B ENOPROTOOPT +is returned. +.SH SYSCTLS +The IP protocol +supports the sysctl interface to configure some global options. The sysctls +can be accessed by reading or writing the +.B /proc/sys/net/ipv4/* +files or using the +.BR sysctl (2) +interface. +.\" +.TP +.B ip_default_ttl +Set the default time-to-live value of outgoing packets. This can be changed +per socket with the +.I IP_TTL +option. +.\" +.TP +.B ip_forward +Enable IP forwarding with a boolean flag. IP forwarding can be also set on a +per interface basis. +.\" +.TP +.B ip_dynaddr +Enable dynamic socket address and masquerading entry rewriting on interface +address change. This is useful for dialup interface with changing IP addresses. +0 means no rewriting, 1 turns it on and 2 enables verbose mode. +.\" +.TP +.B ip_autoconfig +Not documented. +.\" +.TP +.B ip_local_port_range +Contains two integers that define the default local port range allocated to +sockets. Allocation starts with the first number and ends with the second number. +Note that these should not conflict with the ports used by masquerading (although +the case is handled). Also arbitary choices may cause problems with some +firewall packet filters that make assumptions about the local ports in use. +First number should be at least >1024, better >4096 to avoid clashes with well +known ports and to minimize firewall problems. +.\" +.TP +.B ip_no_pmtu_disc +If enabled, don't do Path MTU Discovery for TCP sockets by default. Path MTU +discovery may fail if misconfigured firewalls (that drop all ICMP packets) or +misconfigured interfaces (e.g., a point-to-point link where the both ends don't +agree on the MTU) are on the path. It is better to fix the broken routers on +the path than to turn off Path MTU Discovery globally, because not doing it +incurs a high cost to the network. +.\" +.TP +.BR ipfrag_high_thresh ", " ipfrag_low_thresh +If the amount of queued IP fragments reaches +.BR ipfrag_high_thresh , +the queue +is pruned down to +.BR ipfrag_low_thresh . +Contains an integer with the number of +bytes. +.TP +.B ip_always_defrag +[New with Kernel 2.2.13; in earlier kernel version the feature was controlled +at compile time by the +.B CONFIG_IP_ALWAYS_DEFRAG +option] + +When this boolean frag is enabled (not equal 0) incoming fragments +(parts of IP packets +that arose when some host between origin and destination decided +that the packets were too large and cut them into pieces) will be +reassembled (defragmented) before being processed, even if they are +about to be forwarded. + +Only enable if running either a firewall that is the sole link +to your network or a transparent proxy; never ever turn on here for a +normal router or host. Otherwise fragmented communication may me disturbed +when the fragments would travel over different links. Defragmentation +also has a large memory and CPU time cost. + +This is automagically turned on when masquerading or transparent +proxying are configured. +.TP +.B neigh/* +See +.BR arp (7). +.\" XXX Document the conf/*/* sysctls +.\" XXX Document the route/* sysctls +.\" XXX document them all +.SH IOCTLS +All ioctls described in +.BR socket (7) +apply to ip. +.PP +The ioctls to configure firewalling are documented in +.BR ipfw (4) +from the +.B ipchains +package. +.PP +Ioctls to configure generic device parameters are described in +.BR netdevice (7). +.\" XXX Add a chapter about multicasting +.SH NOTES +Be very careful with the +.B SO_BROADCAST +option \- it is not privileged in Linux. It is easy to overload the network +with careless broadcasts. For new application protocols +it is better to use a multicast group instead of broadcasting. Broadcasting +is discouraged. +.PP +Some other BSD sockets implementations provide +.I IP_RCVDSTADDR +and +.I IP_RECVIF +socket options to get the destination address and the interface of +received datagrams. Linux has the more general +.I IP_PKTINFO +for the same task. +.PP +.SH ERRORS +.\" XXX document all errors. We should really fix the kernels to give more uniform +.\" error returns (ENOMEM vs ENOBUFS, EPERM vs EACCES etc.) +.TP +.B ENOTCONN +The operation is only defined on a connected socket, but the socket wasn't +connected. +.TP +.B EINVAL +Invalid argument passed. +For send operations this can be caused by sending to a +.I blackhole +route. +.TP +.B EMSGSIZE +Datagram is bigger than an MTU on the path and it cannot be fragmented. +.TP +.B EACCES +The user tried to execute an operation without the necessary permissions. +These include: +Sending a packet to a broadcast address without having the +.B SO_BROADCAST +flag set. +Sending a packet via a +.I prohibit +route. +Modifying firewall settings without +.B CAP_NET_ADMIN +or effective user id 0. +Binding to a reserved port without the +.B CAP_NET_BIND_SERVICE +capacibility or effective user id 0. + +.TP +.B EADDRINUSE +Tried to bind to an address already in use. +.TP +.BR ENOPROTOOPT " and " EOPNOTSUPP +Invalid socket option passed. +.TP +.B EPERM +User doesn't have permission to set high priority, change configuration, +or send signals to the requested process or group. +.TP +.B EADDRNOTAVAIL +A non-existent interface was requested or the requested source address was +not local. +.TP +.B EAGAIN +Operation on a non-blocking socket would block. +.TP +.B ESOCKTNOSUPPORT +The socket is not configured or an unknown socket type was requested. +.TP +.B EISCONN +.BR connect (2) +was called on an already connected socket. +.TP +.B EALREADY +An connection operation on a non-blocking socket is already in progress. +.TP +.B ECONNABORTED +A connection was closed during an +.BR accept (2). +.TP +.B EPIPE +The connection was unexpectedly closed or shut down by the other end. +.TP +.B ENOENT +.B SIOCGSTAMP +was called on a socket where no packet arrived. +.TP +.B EHOSTUNREACH +No valid routing table entry matches the destination address. This error +can be caused by a ICMP message from a remote router or for the local +routing table. +.TP +.B ENODEV +Network device not available or not capable of sending IP. +.TP +.B ENOPKG +A kernel subsystem was not configured. +.TP +.BR ENOBUFS ", " ENOMEM +Not enough free memory. +This often means that the memory allocation is limited by the socket buffer +limits, not by the system memory, but this is not 100% consistent. +.PP +Other errors may be generated by the overlaying protocols; see +.BR tcp (7), +.BR raw (7), +.BR udp (7) +and +.BR socket (7). +.SH VERSIONS +.IR IP_PKTINFO , +.IR IP_MTU , +.IR IP_MTU_DISCOVER , +.IR IP_PKTINFO , +.I IP_RECVERR +and +.I IP_ROUTER_ALERT +are new options in Linux 2.2. +They are also all Linux specific and should not be used in +programs intended to be portable. +.PP +.B struct ip_mreqn +is new in Linux 2.2. Linux 2.0 only supported +.BR ip_mreq . +.PP +The sysctls were introduced with Linux 2.2. +.SH COMPATIBILITY +For compatibility with Linux 2.0, the obsolete +.BI "socket(PF_INET, SOCK_RAW, " protocol ) +syntax is still supported to open a +.BR packet (7) +socket. This is deprecated and should be replaced by +.BI "socket(PF_PACKET, SOCK_RAW, " protocol ) +instead. The main difference is the +new +.B sockaddr_ll +address structure for generic link layer information instead of the old +.BR sockaddr_pkt . +.SH BUGS +There are too many inconsistent error values. +.PP +The ioctls to configure IP-specific interface options and ARP tables are +not described. +.PP +Some versions of glibc forget to declare +.IR in_pktinfo . +Workaround currently is to copy it into your program from this man page. +.PP +Receiving the original destination address with +.B MSG_ERRQUEUE +in +.I msg_name +by +.BR recvmsg (2) +does not work in some 2.2 kernels. +.\" .SH AUTHORS +.\" This man page was written by Andi Kleen. +.SH "SEE ALSO" +.BR recvmsg (2), +.BR sendmsg (2), +.BR ipfw (4), +.BR capabilities (7), +.BR netlink (7), +.BR raw (7), +.BR socket (7), +.BR tcp (7), +.BR udp (7) +.PP +RFC791 for the original IP specification. +.br +RFC1122 for the IPv4 host requirements. +.br +RFC1812 for the IPv4 router requirements. +\" LocalWords: XXX autobind INADDR REUSEADDR |