ip6(7P)




NAME

     ip6 - Internet Protocol Version 6


SYNOPSIS

     #include <sys/socket.h>
     #include <netinet/in.h>,
     #include <netinet/ip6.h>

     s = socket(AF_INET6, SOCK_RAW, proto);

     t = t_open ("/dev/rawip6", O_RDWR);


DESCRIPTION

     The IPv6 protocol is the next generation of the internetwork
     datagram  delivery protocol of the Internet protocol family.
     Programs may use IPv6 through higher-level protocols such as
     the Transmission Control Protocol (TCP) or the User Datagram
     Protocol (UDP), or  may  interface  directly  to  IPv6.  See
     tcp(7P)  and  udp(7P).  Direct access may be by means of the
     socket interface, using a "raw socket," or by means  of  the
     Transport  Level  Interface  (TLI). The protocol options and
     IPv6 extension headers defined in the IPv6 specification may
     be set in outgoing datagrams.


APPLICATION PROGRAMMING INTERFACE

     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  speci-
     fied  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 ancil-
     lary  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 transmission of packets to this inter-
           face.  Takes an integer as an argument; the integer is
           the selected interace 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).

     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.

     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 ip6_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 speci-
           fies  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 inter-
           mediate  hops.  May  be  configured,  but  will not be
           applied unless an IPv6 routing header is also  config-
           ured.  Variable length. Takes a complete IPv6 destina-
           tion options extension header as the parameter.

     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.

     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  Con-
     trol  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  sup-
     ported), and fragment header.

     The IPv6 layer will normally act  as  a  router  (forwarding
     datagrams  that are not addressed to it, among other things)
     when the machine has two or more IPv6  interfaces  that  are
     up.  This behavior can be overridden by using ndd(1M) to set
     the /dev/ip6 variable, ip6_forwarding. The value 0 means  do
     not  forward;  the value 1 means forward. The initialization
     scripts (see /etc/init.d/inetinit) set this  value  at  boot
     time  based  on the number of "up" interfaces and whether or
     not the neighbor  discovery  protocol  daemon  configuration
     file  /etc/inet/ndpd.conf exists. The default value is zero;
     ip6_forwarding is set to 1 only if more than  one  interface
     has  been  configured  for  IPv6  and if /etc/inet/ndpd.conf
     exists.

     Additionally, finer grained forwarding can be configured  in
     IPv6.  Each  interface  will create an ifname:ip6_forwarding
     /dev/ip6 variable that can be modified using ndd(1M).  If  a
     per-interface  :ip6_forwarding variable is set to 0, packets
     will neither be forwarded from this interface to others, nor
     forwarded  to  this  interface.  Setting  the ip6_forwarding
     variable   will   toggle   all    of    the    per-interface
     :ip6_forwarding variables to the setting of ip6_forwarding.

     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  unreach-
     able" 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 prob-
     lem with a field in the IPv6  header  or  any  of  the  IPv6
     extension  headers such that the packet cannot be fully pro-
     cessed.

     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 recon-
     structed 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.


SEE ALSO

     ndd(1M), read(2), write(2), bind(3SOCKET), connect(3SOCKET),
     getsockopt(3SOCKET),     recv(3SOCKET),    recvmsg(3SOCKET),
     send(3SOCKET),    sendmsg(3SOCKET),     setsockopt(3SOCKET),
     defaultrouter(4),    icmp6(7P),    if_tcp(7P),    ipsec(7P),
     inet6(7P), routing(7P), tcp(7P), udp(7P)

     Deering, S. and Hinden, B.   RFC  2460,  Internet  Protocol,
     Version   6  (IPv6)  Specification.  The  Internet  Society.
     December, 1998.

     Stevens, W., and Thomas, M. RFC 2292, Advanced  Sockets  API
     for IPv6. Network Working Group. February 1998.


DIAGNOSTICS

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

     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 per-
           formed, 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 con-
           nect(),  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.


NOTES

     Applications using the sockets API  must  use  the  Advanced
     Sockets  API  for  IPv6  (RFC  2292)  to see elements of the
     inbound packet's IPv6 header or extension headers.


Man(1) output converted with man2html