2004-11-03 13:51:07 +00:00
|
|
|
'\" t
|
|
|
|
.\" Don't change the first line, it tells man that we need tbl.
|
|
|
|
.\" 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: raw.7,v 1.6 1999/06/05 10:32:08 freitag Exp $
|
|
|
|
.TH RAW 7 1998-10-02 "Linux Man Page" "Linux Programmer's Manual"
|
|
|
|
.SH NAME
|
|
|
|
raw, SOCK_RAW \- Linux IPv4 raw sockets
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B #include <sys/socket.h>
|
|
|
|
.br
|
|
|
|
.B #include <netinet/in.h>
|
|
|
|
.br
|
|
|
|
.BI "raw_socket = socket(PF_INET, SOCK_RAW, int " protocol );
|
|
|
|
|
|
|
|
.SH DESCRIPTION
|
|
|
|
Raw sockets allow new IPv4 protocols to be implemented in user space.
|
2005-12-14 10:27:45 +00:00
|
|
|
A raw socket receives or sends the raw datagram not
|
|
|
|
including link level headers.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
|
|
|
The IPv4 layer generates an IP header when sending a packet unless the
|
|
|
|
.B IP_HDRINCL
|
|
|
|
socket option is enabled on the socket.
|
|
|
|
When it is enabled, the packet must contain an IP header.
|
|
|
|
For receiving the IP header is always included in the packet.
|
|
|
|
|
2005-07-18 16:02:32 +00:00
|
|
|
Only processes with an effective user ID of 0 or the
|
2004-11-03 13:51:07 +00:00
|
|
|
.B CAP_NET_RAW
|
|
|
|
capability are allowed to open raw sockets.
|
|
|
|
|
|
|
|
All packets or errors matching the
|
|
|
|
.I protocol
|
|
|
|
number specified
|
|
|
|
for the raw socket are passed to this socket. For a list of the
|
2005-06-21 08:32:40 +00:00
|
|
|
allowed protocols see RFC\ 1700 assigned numbers and
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR getprotobyname (3).
|
|
|
|
|
|
|
|
A protocol of
|
|
|
|
.B IPPROTO_RAW
|
|
|
|
implies enabled
|
|
|
|
.B IP_HDRINCL
|
2006-01-03 10:58:34 +00:00
|
|
|
and is able to send any IP protocol that is specified in the passed
|
|
|
|
header.
|
2004-11-03 13:51:07 +00:00
|
|
|
Receiving of all IP protocols via
|
|
|
|
.B IPPROTO_RAW
|
|
|
|
is not possible using raw sockets.
|
|
|
|
|
|
|
|
.TS
|
|
|
|
tab(:) allbox;
|
|
|
|
c s
|
|
|
|
l l.
|
|
|
|
IP Header fields modified on sending by IP_HDRINCL
|
|
|
|
IP Checksum:Always filled in.
|
|
|
|
Source Address:Filled in when zero.
|
|
|
|
Packet Id:Filled in when zero.
|
|
|
|
Total Length:Always filled in.
|
|
|
|
.TE
|
|
|
|
.PP
|
|
|
|
|
|
|
|
If
|
|
|
|
.B IP_HDRINCL
|
|
|
|
is specified and the IP header has a non-zero destination address then
|
|
|
|
the destination address of the socket is used to route the packet. When
|
|
|
|
.B MSG_DONTROUTE
|
|
|
|
is specified the destination address should refer to a local interface,
|
2005-06-24 14:44:16 +00:00
|
|
|
otherwise a routing table lookup is done anyway but gatewayed routes
|
2004-11-03 13:51:07 +00:00
|
|
|
are ignored.
|
|
|
|
|
|
|
|
If
|
|
|
|
.B IP_HDRINCL
|
|
|
|
isn't set then IP header options can be set on raw sockets with
|
|
|
|
.BR setsockopt (2);
|
|
|
|
see
|
|
|
|
.BR ip (7)
|
|
|
|
for more information.
|
|
|
|
|
|
|
|
In Linux 2.2 all IP header fields and options can be set using
|
|
|
|
IP socket options. This means raw sockets are usually only needed for new
|
|
|
|
protocols or protocols with no user interface (like ICMP).
|
|
|
|
|
|
|
|
When a packet is received, it is passed to any raw sockets which have
|
|
|
|
been bound to its protocol before it is passed to other protocol handlers
|
|
|
|
(e.g. kernel protocol modules).
|
|
|
|
|
|
|
|
.SH "ADDRESS FORMAT"
|
|
|
|
|
|
|
|
Raw sockets use the standard
|
2006-03-20 13:03:53 +00:00
|
|
|
.I sockaddr_in
|
2004-11-03 13:51:07 +00:00
|
|
|
address structure defined in
|
|
|
|
.BR ip (7).
|
|
|
|
The
|
2006-03-20 13:03:53 +00:00
|
|
|
.I sin_port
|
2004-11-03 13:51:07 +00:00
|
|
|
field could be used to specify the IP protocol number,
|
|
|
|
but it is ignored for sending in Linux 2.2 and should be always
|
|
|
|
set to 0 (see BUGS)
|
|
|
|
For incoming packets
|
2006-03-20 13:03:53 +00:00
|
|
|
.I sin_port
|
2004-11-03 13:51:07 +00:00
|
|
|
is set to the protocol of the packet.
|
|
|
|
See the
|
2005-11-03 12:47:27 +00:00
|
|
|
.I <netinet/in.h>
|
2004-11-03 13:51:07 +00:00
|
|
|
include file for valid IP protocols.
|
|
|
|
|
|
|
|
.SH "SOCKET OPTIONS"
|
|
|
|
Raw socket options can be set with
|
|
|
|
.BR setsockopt (2)
|
|
|
|
and read with
|
|
|
|
.BR getsockopt (2)
|
|
|
|
by passing the
|
2006-03-20 13:03:53 +00:00
|
|
|
.B IPPROTO_RAW
|
2005-08-16 11:47:35 +00:00
|
|
|
.\" Or SOL_RAW on Linux
|
2004-11-03 13:51:07 +00:00
|
|
|
family flag.
|
|
|
|
|
|
|
|
.TP
|
|
|
|
.B ICMP_FILTER
|
|
|
|
Enable a special filter for raw sockets bound to the
|
|
|
|
.B IPPROTO_ICMP
|
|
|
|
protocol. The value has a bit set for each ICMP message type which
|
|
|
|
should be filtered out. The default is to filter no ICMP messages.
|
|
|
|
|
|
|
|
.PP
|
|
|
|
In addition all
|
|
|
|
.BR ip (7)
|
2005-08-16 11:47:35 +00:00
|
|
|
.B IPPROTO_IP
|
2004-11-03 13:51:07 +00:00
|
|
|
socket options valid for datagram sockets are supported.
|
|
|
|
|
|
|
|
.SH NOTES
|
2006-01-03 10:58:34 +00:00
|
|
|
Raw sockets fragment a packet when its total length exceeds the
|
|
|
|
interface MTU
|
2004-11-03 13:51:07 +00:00
|
|
|
(but see BUGS).
|
|
|
|
A more network friendly and faster alternative is to implement path MTU
|
|
|
|
discovery as described in the
|
|
|
|
.B IP_MTU_DISCOVER
|
|
|
|
section of
|
|
|
|
.BR ip (7).
|
|
|
|
|
|
|
|
A raw socket can be bound to a specific local address using the
|
|
|
|
.BR bind (2)
|
2005-12-14 10:27:45 +00:00
|
|
|
call.
|
|
|
|
If it isn't bound all packets with the specified IP protocol are received.
|
2004-11-03 13:51:07 +00:00
|
|
|
In addition a RAW socket can be bound to a specific network device using
|
2005-11-02 13:55:25 +00:00
|
|
|
.BR SO_BINDTODEVICE ;
|
2004-11-03 13:51:07 +00:00
|
|
|
see
|
|
|
|
.BR socket (7).
|
|
|
|
|
|
|
|
An
|
|
|
|
.B IPPROTO_RAW
|
|
|
|
socket is send only.
|
|
|
|
If you really want to receive all IP packets use a
|
|
|
|
.BR packet (7)
|
|
|
|
socket with the
|
|
|
|
.B ETH_P_IP
|
2005-12-14 10:27:45 +00:00
|
|
|
protocol. Note that packet sockets don't reassemble IP fragments,
|
|
|
|
unlike raw sockets.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
2005-12-14 10:27:45 +00:00
|
|
|
If you want to receive all ICMP packets for a datagram socket
|
|
|
|
it is often better to use
|
2004-11-03 13:51:07 +00:00
|
|
|
.B IP_RECVERR
|
|
|
|
on that particular socket; see
|
|
|
|
.BR ip (7).
|
|
|
|
|
|
|
|
Raw sockets may tap all IP protocols in Linux, even
|
2006-01-03 10:58:34 +00:00
|
|
|
protocols like ICMP or TCP which have a protocol module in the kernel.
|
|
|
|
In this case the packets are passed to both the kernel module and the raw
|
2005-12-14 10:27:45 +00:00
|
|
|
socket(s).
|
|
|
|
This should not be relied upon in portable programs, many other BSD
|
2004-11-03 13:51:07 +00:00
|
|
|
socket implementation have limitations here.
|
|
|
|
|
2006-01-03 10:58:34 +00:00
|
|
|
Linux never changes headers passed from the user (except for filling
|
|
|
|
in some zeroed fields as described for
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR IP_HDRINCL ).
|
|
|
|
This differs from many other implementations of raw sockets.
|
|
|
|
|
2006-01-03 10:58:34 +00:00
|
|
|
RAW sockets are generally rather unportable and should be avoided in
|
|
|
|
programs intended to be portable.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
|
|
|
Sending on raw sockets should take the IP protocol from
|
2006-03-20 13:03:53 +00:00
|
|
|
.IR sin_port ;
|
|
|
|
this ability was lost in Linux 2.2.
|
|
|
|
The workaround is to use
|
2005-07-19 15:36:19 +00:00
|
|
|
.BR IP_HDRINCL .
|
2004-11-03 13:51:07 +00:00
|
|
|
|
|
|
|
.SH "ERROR HANDLING"
|
|
|
|
Errors originating from the network are only passed to the user when the
|
|
|
|
socket is connected or the
|
|
|
|
.B IP_RECVERR
|
|
|
|
flag is enabled. For connected sockets only
|
|
|
|
.B EMSGSIZE
|
|
|
|
and
|
|
|
|
.B EPROTO
|
|
|
|
are passed for compatibility. With
|
|
|
|
.B IP_RECVERR
|
|
|
|
all network errors are saved in the error queue.
|
|
|
|
.SH ERRORS
|
|
|
|
.TP
|
|
|
|
.B EMSGSIZE
|
|
|
|
Packet too big. Either Path MTU Discovery is enabled (the
|
|
|
|
.B IP_MTU_DISCOVER
|
2006-01-03 10:58:34 +00:00
|
|
|
socket flag) or the packet size exceeds the maximum allowed IPv4
|
|
|
|
packet size of 64KB.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EACCES
|
2006-01-03 10:58:34 +00:00
|
|
|
User tried to send to a broadcast address without having the
|
|
|
|
broadcast flag set on the socket.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EPROTO
|
|
|
|
An ICMP error has arrived reporting a parameter problem.
|
|
|
|
.TP
|
|
|
|
.B EFAULT
|
|
|
|
An invalid memory address was supplied.
|
|
|
|
.TP
|
|
|
|
.B EOPNOTSUPP
|
|
|
|
Invalid flag has been passed to a socket call (like
|
|
|
|
.BR MSG_OOB ).
|
|
|
|
.TP
|
|
|
|
.B EINVAL
|
|
|
|
Invalid argument.
|
|
|
|
.TP
|
|
|
|
.B EPERM
|
|
|
|
The user doesn't have permission to open raw sockets. Only processes
|
2005-07-18 16:02:32 +00:00
|
|
|
with a effective user ID of 0 or the
|
2004-11-03 13:51:07 +00:00
|
|
|
.B CAP_NET_RAW
|
|
|
|
attribute may do that.
|
|
|
|
|
|
|
|
.SH VERSIONS
|
|
|
|
.B IP_RECVERR
|
|
|
|
and
|
|
|
|
.B ICMP_FILTER
|
|
|
|
are new in Linux 2.2. They are Linux extensions
|
|
|
|
and should not be used in portable programs.
|
|
|
|
|
2006-01-03 10:58:34 +00:00
|
|
|
Linux 2.0 enabled some bug-to-bug compatibility with BSD in the
|
|
|
|
raw socket code when the
|
|
|
|
SO_BSDCOMPAT socket option was set \(em since Linux 2.2,
|
2005-12-14 10:27:45 +00:00
|
|
|
this option no longer has that effect.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
|
|
|
.SH BUGS
|
|
|
|
Transparent proxy extensions are not described.
|
|
|
|
|
|
|
|
When the
|
|
|
|
.B IP_HDRINCL
|
2005-12-14 10:27:45 +00:00
|
|
|
option is set datagrams will not be fragmented and are limited to
|
|
|
|
the interface MTU.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
|
|
|
Setting the IP protocol for sending in
|
2006-03-20 13:03:53 +00:00
|
|
|
.I sin_port
|
2005-12-14 10:27:45 +00:00
|
|
|
got lost in Linux 2.2.
|
|
|
|
The protocol that the socket was bound to or that
|
2004-11-03 13:51:07 +00:00
|
|
|
was specified in the initial
|
|
|
|
.BR socket (2)
|
|
|
|
call is always used.
|
|
|
|
|
|
|
|
.SH AUTHORS
|
|
|
|
This man page was written by Andi Kleen.
|
|
|
|
|
|
|
|
.SH "SEE ALSO"
|
|
|
|
.BR recvmsg (2),
|
|
|
|
.BR sendmsg (2),
|
|
|
|
.BR capabilities (7),
|
|
|
|
.BR ip (7),
|
|
|
|
.BR socket (7)
|
|
|
|
|
2005-06-21 08:32:40 +00:00
|
|
|
.B RFC\ 1191
|
2004-11-03 13:51:07 +00:00
|
|
|
for path MTU discovery.
|
|
|
|
|
2005-06-21 08:32:40 +00:00
|
|
|
.B RFC\ 791
|
2004-11-03 13:51:07 +00:00
|
|
|
and the
|
2005-11-03 12:47:27 +00:00
|
|
|
.I <linux/ip.h>
|
2004-11-03 13:51:07 +00:00
|
|
|
include file for the IP protocol.
|