The STREAMS driver /dev/rawip6 is the TLI transport
provider that provides raw access to IPv6.
Raw IPv6 sockets are connectionless and are normally used
with the sendto() and recvfrom() calls (see
send(3SOCKET) and recv(3SOCKET)), although the
connect(3SOCKET) call may also be used to fix the destination for
future datagrams. In this case, the read(2) or recv(3SOCKET)
and write(2) or send(3SOCKET) calls may be used. Ancillary
data may also be sent or received over raw IPv6 sockets using the
sendmsg(3SOCKET) and recvmsg(3SOCKET) system calls.
Unlike raw IP, IPv6 applications do not include a
complete IPv6 header when sending; there is no IPv6 analog to
the IP IP_HDRINCL socket option. IPv6 header values may
be specified or received as ancillary data to a sendmsg(3SOCKET) or
recvmsg(3SOCKET) system call, or may be specified as
"sticky" options on a per-socket basis by using the
setsockopt(3SOCKET) system call. Such sticky options are applied to
all outbound packets unless overridden by ancillary data. If any ancillary
data is specified in a sendmsg(3SOCKET) call, all sticky options not
explicitly overridden revert to default values for that datagram only; the
sticky options persist as set for subsequent datagrams.
Since sendmsg(3SOCKET) is not supported for
SOCK_STREAM upper level protocols such as TCP, ancillary data
is unsupported for TCP. Sticky options, however, are supported.
Since sendmsg(3SOCKET) is supported for SOCK_DGRAM
upper level protocols, both ancillary data and sticky options are supported
for UDP, ICMP6, and raw IPv6 sockets.
The socket options supported at the IPv6 level are:
IPV6_BOUND_IF
Limit reception and transmission of packets to this
interface. Takes an integer as an argument; the integer is the selected
interface index.
IPV6_UNSPEC_SRC
Boolean. Allow/disallow sending with a zero source
address.
IPV6_UNICAST_HOPS
Default hop limit for unicast datagrams. This option
takes an integer as an argument. Its value becomes the new default value for
ip6_hops that IPv6 will use on outgoing unicast datagrams sent
from that socket. The initial default is 60.
IPV6_CHECKSUM
Specify the integer offset in bytes into the user data of
the checksum location. Does not apply to the ICMP6 protocol. Note:
checksums are required for all IPv6 datagrams; this is different from
IP, in which datagram checksums were optional. IPv6 will compute
the ULP checksum if the value in the checksum field is zero.
IPV6_SEC_OPT
Enable or obtain IPsec security settings for this socket.
For more details on the protection services of IPsec, see
ipsec(7P).
IPV6_DONTFRAG
Boolean. Control fragmentation.
IPV6_USE_MIN_MTU
Controls whether path MTU discovery is used. If set to 1,
path MTU discovery is never used and IPv6 packets are sent with the IPv6
minimum MTU. If set to -1, path MTU discovery is not used for multicast and
multicast packets are sent with the IPv6 minimum MTU. If set to 0, path MTU is
always performed.
IPV6_V6ONLY
Boolean. If set, only V6 packets can be sent or
received
IPV6_SRC_PREFERENCES
Enable or obtain Source Address Selection rule settings
for this socket. For more details on the Source Address Selection rules, see
inet6(7P).
The following options are boolean switches controlling the
reception of ancillary data:
IPV6_RECVPKTINFO
Enable/disable receipt of the index of the interface the
packet arrived on, and of the inbound packet's destination address.
IPV6_RECVHOPLIMIT
Enable/disable receipt of the inbound packet's current
hoplimit.
IPV6_RECVHOPOPTS
Enable/disable receipt of the inbound packet's
IPv6 hop-by-hop extension header.
IPV6_RECVDSTOPTS
Enable/disable receipt of the inbound packet's
IPv6 destination options extension header.
IPV6_RECVRTHDR
Enable/disable receipt of the inbound packet's
IPv6 routing header.
IPV6_RECVRTHDRDSTOPTS
Enable/disable receipt of the inbound packet's
intermediate-hops options extension header. This option is obsolete.
IPV6_RECVDSTOPTS turns on receipt of both destination option headers.
IPV6_RECVTCLASS
Enable/disable receipt of the traffic class of the
inbound packet.
IPV6_RECVPATHMTU
Enable/disable receipt of the path mtu of the inbound
packet.
The following options may be set as sticky options with
setsockopt(3SOCKET) or as ancillary data to a sendmsg(3SOCKET)
system call:
IPV6_PKTINFO
Set the source address and/or interface out which the
packet(s) will be sent. Takes a struct in6_pktinfo as the
parameter.
IPV6_HOPLIMIT
Set the initial hoplimit for outbound datagrams. Takes an
integer as the parameter. Note: This option sets the hoplimit only for
ancillary data or sticky options and does not change the default hoplimit for
the socket; see IPV6_UNICAST_HOPS and IPV6_MULTICAST_HOPS to
change the socket's default hoplimit.
IPV6_NEXTHOP
Specify the IPv6 address of the first hop, which
must be a neighbor of the sending host. Takes a struct
sockaddr_in6 as the parameter. When this option specifies the same
address as the destination IPv6 address of the datagram, this is
equivalent to the existing SO_DONTROUTE option.
IPV6_HOPOPTS
Specify one or more hop-by-hop options. Variable length.
Takes a complete IPv6 hop-by-hop options extension header as the
parameter.
IPV6_DSTOPTS
Specify one or more destination options. Variable length.
Takes a complete IPv6 destination options extension header as the
parameter.
IPV6_RTHDR
Specify the IPv6 routing header. Variable length.
Takes a complete IPv6 routing header as the parameter. Currently, only
type 0 routing headers are supported.
IPV6_RTHDRDSTOPTS
Specify one or more destination options for all
intermediate hops. May be configured, but will not be applied unless an
IPv6 routing header is also configured. Variable length. Takes a
complete IPv6 destination options extension header as the
parameter.
IPV6_PATHMTU
Get the path MTU associated with a connected socket.
Takes a ip6_mtuinfo as the parameter.
IPV6_TCLASS
Set the traffic class associated with outgoing packets.
The parameter is an integer. If the parameter is less then -1 or greater then
256, EINVAL is returned. If the parameter is equal to -1, use the default. If
the parameter is between 0 and 255 inclusive, use that value.
The following options affect the socket's multicast behavior:
IPV6_JOIN_GROUP
Join a multicast group. Takes a struct
ipv6_mreq as the parameter; the structure contains a multicast address
and an interface index.
IPV6_LEAVE_GROUP
Leave a multicast group. Takes a struct
ipv6_mreq as the parameter; the structure contains a multicast address
and an interface index.
MCAST_JOIN_GROUP
Functionally equivalent to IPV6_JOIN_GROUP. Takes a
struct group_req as the parameter. The structure contains a
multicast address and an interface index.
MCAST_BLOCK_SOURCE
Block multicast packets on a particular multicast group
whose source address matches the given source address. The specified group
must be joined previously using IPV6_JOIN_GROUP or MCAST_JOIN_GROUP. Takes a
struct group_source_req as the parameter. The structure contains
an interface index, a multicast address, and a source address.
MCAST_UNBLOCK_SOURCE
Unblock multicast packets which were previously blocked
using MCAST_BLOCK_SOURCE. Takes a struct group_source_req as the
parameter. The structure contains an interface index, a multicast address, and
a source address.
MCAST_LEAVE_GROUP
Functionally equivalent to IPV6_LEAVE_GROUP. Takes a
struct group_req as the parameter. The structure contains a
multicast address and an interface index.
MCAST_JOIN_SOURCE_GROUP
Begin receiving packets for the given multicast group
whose source address matches the specified address. Takes a struct
group_source_req as the parameter. The structure contains an interface
index, a multicast address, and a source address.
MCAST_LEAVE_SOURCE_GROUP
Stop receiving packets for the given multicast group
whose source address matches the specified address. Takes a struct
group_source_req as the parameter. The structure contains an interface
index, a multicast address, and a source address.
IPV6_MULTICAST_IF
The outgoing interface for multicast packets. This option
takes an integer as an argument; the integer is the interface index of the
selected interface.
IPV6_MULTICAST_HOPS
Default hop limit for multicast datagrams. This option
takes an integer as an argument. Its value becomes the new default value for
ip6_hops that IPv6 will use on outgoing multicast datagrams sent
from that socket. The initial default is 1.
IPV6_MULTICAST_LOOP
Loopback for multicast datagrams. Normally multicast
datagrams are delivered to members on the sending host. Setting the unsigned
character argument to 0 will cause the opposite behavior.
The multicast socket options can be used with any datagram socket
type in the IPv6 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 IPv6 hoplimit field to 1, meaning
that the packet will not be forwarded by routers.
Raw IPv6 datagrams can also be sent and received using the
TLI connectionless primitives.
Datagrams flow through the IPv6 layer in two directions:
from the network up to user processes and from user processes
down to the network. Using this orientation, IPv6 is layered
above the network interface drivers and below the transport
protocols such as UDP and TCP. The Internet Control Message
Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6)
is logically a part of IPv6. See icmp6(7P).
Unlike IP, IPv6 provides no checksum of the
IPv6 header. Also unlike IP, upper level protocol checksums
are required. IPv6 will compute the ULP/data portion checksum
if the checksum field contains a zero (see IPV6_CHECKSUM option
above).
IPv6 extension headers in received datagrams are processed
in the IPv6 layer according to the protocol specification. Currently
recognized IPv6 extension headers include hop-by-hop options header,
destination options header, routing header (currently, only type 0 routing
headers are supported), and fragment header.
By default, the IPv6 layer will not forward IPv6 packets that are
not addressed to it. This behavior can be overridden by using
routeadm(1M) to enable the ipv6-forwarding option. IPv6 forwarding is
configured at boot time based on the setting of routeadm(1M)'s
ipv6-forwarding option.
For backwards compatibility, IPv6 forwarding can be enabled or
disabled using ndd(1M)'s ip_forwarding variable. It is set to 1 if
IPv6 forwarding is enabled, or 0 if it is disabled.
Additionally, finer-grained forwarding can be configured in IPv6.
Each interface can be configured to forward IPv6 packets by setting the
IFF_ROUTER interface flag. This flag can be set and cleared using
ifconfig(1M)'s router and -router options. If an interface's
IFF_ROUTER flag is set, packets can be forwarded to or from the interface.
If it is clear, packets will neither be forwarded from this interface to
others, nor forwarded to this interface. Setting the ip6_forwarding variable
sets all of the IPv6 interfaces' IFF_ROUTER flags.
For backwards compatibility, each interface creates an
<ifname>ip6_forwarding /dev/ip6 variable that can be modified
using ndd(1M). An interface's :ip6_forwarding ndd variable is
a boolean variable that mirrors the status of its IFF_ROUTER interface flag.
It is set to 1 if the flag is set, or 0 if it is clear. This interface
specific <ifname>:ip6_forwarding ndd variable is obsolete and
may be removed in a future release of Solaris. The ifconfig(1M)
router and -router interfaces are preferred.
The IPv6 layer will send an ICMP6 message back to
the source host in many cases when it receives a datagram that can not be
handled. A "time exceeded" ICMP6 message will
be sent if the ip6_hops field in the IPv6 header drops to zero
in the process of forwarding a datagram. A "destination
unreachable" message will be sent by a router or by the
originating host if a datagram can not be sent on because there is no route
to the final destination; it will be sent by a router when it encounters a
firewall prohibition; it will be sent by a destination node when the
transport protocol (that is, TCP) has no listener. A
"packet too big" message will be sent by a
router if the packet is larger than the MTU of the outgoing link
(this is used for Path MTU Discovery). A "parameter
problem" message will be sent if there is a problem with a field
in the IPv6 header or any of the IPv6 extension headers such
that the packet cannot be fully processed.
The IPv6 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 IPv6 back up to the user process.
A socket operation may fail with one of the following errors returned:
EPROTONOSUPPORT
Unsupported protocol (for example, IPPROTO_RAW.)
EACCES
A bind() operation was attempted with a
"reserved" port number and the effective user ID of the process was
not the privileged user.
EADDRINUSE
A bind() operation was attempted on a socket with
a network address/port pair that has already been bound to another
socket.
EADDRNOTAVAIL
A bind() operation was attempted for an address
that is not configured on this machine.
EINVAL
A sendmsg() operation with a non-NULL
msg_accrights was attempted.
EINVAL
A getsockopt() or setsockopt() operation
with an unknown socket option name was given.
EINVAL
A getsockopt() or setsockopt() operation
was attempted with the IPv6 option field improperly formed; an option
field was shorter than the minimum value or longer than the option buffer
provided; the value in the option field was invalid.
EISCONN
A connect() operation was attempted on a socket on
which a connect() operation had already been performed, and the socket
could not be successfully disconnected before making the new connection.
EISCONN
A sendto() or sendmsg() operation
specifying an address to which the message should be sent was attempted on a
socket on which a connect() operation had already been performed.
EMSGSIZE
A send(), sendto(), or sendmsg()
operation was attempted to send a datagram that was too large for an
interface, but was not allowed to be fragmented (such as broadcasts).
ENETUNREACH
An attempt was made to establish a connection via
connect(), or to send a datagram by means of sendto() or
sendmsg(), where there was no matching entry in the routing table; or
if an ICMP "destination unreachable" message
was received.
ENOTCONN
A send() or write() operation, or a
sendto() or sendmsg() operation not specifying an address to
which the message should be sent, was attempted on a socket on which a
connect() operation had not already been performed.
ENOBUFS
The system ran out of memory for fragmentation buffers or
other internal data structures.
ENOMEM
The system was unable to allocate memory for an
IPv6 socket option or other internal data structures.
ENOPROTOOPT
An IP socket option was attempted on an
IPv6 socket, or an IPv6 socket option was attempted on an
IP socket.
ENOPROTOOPT
Invalid socket type for the option.