*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->Tru64 Unix man pages -> ip (7)              
Title
Content
Arch
Section
 

ip(7)

Contents


NAME    [Toc]    [Back]

       ip - Internet Protocol (IPv4 and IPv6)

SYNOPSIS    [Toc]    [Back]

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


       The following is the socket call for AF_INET sockets:

       s = socket(AF_INET, SOCK_RAW, proto);

       The following is the socket call for AF_INET6 sockets:

       s = socket(AF_INET6, SOCK_RAW, proto);

DESCRIPTION    [Toc]    [Back]

       The Internet Protocol (IP) is the transport layer protocol
       used by the Internet Protocol family.  Options may be  set
       at the IP level when using higher-level protocols that are
       based on IP (such as  the  Transmission  Control  Protocol
       (TCP)  and the User Datagram Package (UDP)).  You can also
       access the protocol through a raw socket  when  developing
       new  protocols,  or special purpose applications.  Both IP
       version 4 and IP version 6 are supported.

       IP-level options are set with  the  setsockopt()  function
       and examined with the getsockopt() function. Other options
       supported by the getsockopt() and  setsockopt()  functions
       can  be  found  in the <netinet/in.h> header file for IPv4
       and in the <netinet/in6.h> header file for IPv6.

       Provides IPv4 options to be transmitted in the IPv4 header
       of each outgoing packet or examines IPv4 header options on
       incoming packets.  The format of IPv4 options to  be  sent
       is  that  specified  by  the  IPv4 specification, with one
       exception: the list of addresses for Source Route  options
       must include the first-hop gateway at the beginning of the
       list of gateways. The first-hop gateway  address  will  be
       extracted  from  the  option  list  and  the size adjusted
       accordingly before use.

              IPv4 options may be used with any  socket  type  in
              the  Internet  family.  Enables a SOCK_DGRAM socket
              to receive the destination IPv4 address for  a  UDP
              datagram.   Enables  a SOCK_DGRAM socket to receive
              the IPv4 options for  a  UDP  datagram.   Sets  the
              type-of-service  (TOS) field in the IPv4 header for
              a TCP or UDP socket.  For example:

              int tos; setsockopt(s,  IPPROTO_IP,  IP_TOS,  &tos,
              sizeof(tos));

              You  can  set  the  type-of-service  to  any of the
              defined  constants  in  <netinet/ip.h>.   Typically
              used  constants are: IPTOS_LOWDELAY, IPTOS_THROUGHPUT,
 and IPTOS_RELIABILITY.

              To determine the current value for this option, use
              the getsockopt call. For example:

              int  tos;  getsockopt(s,  IPPROTO_IP, IP_TOS, &tos,
              sizeof(tos)); Sets the time-to-live (TTL) field  in
              the IPv4 header for a TCP or UDP socket, by default
              the values are 60 and 30, respectively,  for  example:


              int  ttl;  setsockopt(s,  IPPROTO_IP, IP_TTL, &ttl,
              sizeof(ttl));

              To determine the current value for this option, use
              the getsockopt call, for example:

              int  ttl;  getsockopt(s,  IPPROTO_IP, IP_TTL, &ttl,
              sizeof(ttl)); Enables a SOCK_RAW socket to  receive
              IPv6 destination options, for example:

              int on = 1;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS,
                          &on, sizeof(on)) == -1)
                              perror("setsockopt      IPV6_RECVDSTOPTS");
 Enables a SOCK_RAW socket to receive  the
              IPv6 hop limit, for example:

              int on = 1;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
                          &on, sizeof(on)) == -1)
                              perror("setsockopt     IPV6_RECVHOPLIMIT");


              To determine the current value for this option, use
              the  getsockopt call.  Enables a SOCK_RAW socket to
              receive the IPv6  Hop-by-Hop  options  header,  for
              example:

              int on = 1;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS,
                          &on, sizeof(on)) == -1)
                              perror("setsockopt
              IPV6_RECVHOPOPTS"); Enables a  SOCK_RAW  socket  to
              receive  the  send  and  receive interfaces and the
              source and destination addresses, for example:

              int on = 1;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO,
                          &on, sizeof(on)) == -1)
                              perror("setsockopt    IPV6_RECVPKTINFO");
  Enables  a  SOCK_RAW socket to receive the
              IPv6 routing header, for example:

              int on = 1;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR,
                          &on, sizeof(on)) == -1)
                              perror("setsockopt
              IPV6_RECVRTHDR"); Sets the hop limit for all subsequent
 IPv6 unicast  packets  sent  on  a  specified
              socket.  For example:

              int  hoplimit = 10; if (setsockopt(s, IPPROTO_IPV6,
              IPV6_UNICAST_HOPS,
                          (char *)  &hoplimit,  sizeof(hoplimit))
              == -1)
                              perror("setsockopt
              IPV6_UNICAST_HOPS");

              To determine the current value for this option, use
              the getsockopt call. For example:

              int hoplimit; size_t len = sizeof(hoplimit);

              if (getsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
                      (char *) &hoplimit, &len) == -1);
                  perror("getsockopt IPV6_UNICAST_HOPS"); else
                  printf("Using  %d for hop limit.\n", hoplimit);
              Specifies whether to restrict AF_INET6  sockets  to
              sending  and receiving only IPv6 packets. For example:


              int  on  =  1;  if   (setsockopt(s,   IPPROTO_IPV6,
              IPV6_V6ONLY,
                      (char *)&on, sizeof(on)) == -1)
                  perror("setsockopt IPV6_V6ONLY"); else
                  printf("IPV6_V6ONLY option set");

              If  set, operations with IPv4-mapped IPv6 addresses
              are not allowed.  This is a  Boolean  option.   The
              default  (0)  is to accept both IPv4 and IPv6 packets.


   MULTICASTING    [Toc]    [Back]
       IP multicasting is supported on AF_INET and AF_INET6 sockets
 of type SOCK_DGRAM and SOCK_RAW only, and only on networks
 where the interface  driver  supports  multicasting.
       By  default, if a multicast datagram is sent to a group to
       which the sending host itself  belongs  (on  the  outgoing
       interface),  a  copy of the datagram is looped back by the
       IP layer for local delivery.

       A host must become a member of a multicast group before it
       can  receive  datagrams sent to the group.  Memberships in
       multicast groups are dropped when the socket is closed  or
       the process exits.

   IPv4 Multicasting    [Toc]    [Back]
       The  following  IPv4  multicasting  options are supported:
       Joins an IPv4 multicast group, for example:

              struct  ip_mreq  mreq;  setsockopt(s,   IPPROTO_IP,
              IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

              The mreq parameter is the following structure:

              struct ip_mreq {
                    struct  in_addr  imr_multiaddr;  /* multicast
              group to join */
                    struct in_addr imr_interface; /* interface on
              which to join */ }

              The  imr_interface  should  be INADDR_ANY to choose
              the  default  multicast  interface,  or  the   IPv4
              address of a particular multicast-capable interface
              if the host is multihomed.  Membership  is  associated
  with  a single interface; programs running on
              multihomed hosts may need to join the same group on
              more  than one interface.  Up to IP_MAX_MEMBERSHIPS
              (currently 65535) memberships may  be  added  on  a
              single  socket.  Drops a membership in an IPv4 multicast
 group, for example:

              struct  ip_mreq  mreq;  setsockopt(s,   IPPROTO_IP,
              IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));

              The mreq parameter contains the same values as used
              to add the membership.  Overrides the  default  for
              subsequent  IPv4 transmissions from a given socket.
              By default, for  hosts  with  multiple  interfaces,
              each  multicast  transmission is sent from the primary
 network interface.

              struct  in_addr  addr;  setsockopt(s,   IPPROTO_IP,
              IP_MULTICAST_IF, &addr, sizeof(addr));

              The addr parameter specifies the local IPv4 address
              of the desired interface or INADDR_ANY  to  specify
              the  default  interface.  An interface's local IPv4
              address and multicast capability  can  be  obtained
              through  the  SIOCGIFCONF  and  SIOCGIFLAGS ioctls.
              Normal applications should not  need  to  use  this
              option.   Specifies  whether or not subsequent IPv6
              datagrams  are  looped  back,  giving  the   sender
              explicit control, for example:

              u_char   loop;     /*  0  =  disable,  1  =  enable
              (default) */  setsockopt(s,  IPPROTO_IP,  IP_MULTICAST_LOOP,
 &loop, sizeof(loop));

              This  option  improves performance for applications
              that may have no more than one instance on a single
              host  (such as a router daemon), by eliminating the
              overhead  of  receiving  their  own  transmissions.
              However,  applications  for which there may be more
              than one instance on a single host (such as a  conferencing
 program) or for which the sender does not
              belong to the destination group (such  as  a  timequerying
  program)  generally  should  not use this
              option.

              An IPv4 multicast datagram sent with an initial TTL
              greater than 1 may be delivered to the sending host
              on a different interface from that on which it  was
              sent,  if the host belongs to the destination group
              on that  other  interface.   The  loopback  control
              option has no effect on such delivery.  Changes the
              time-to-live (TTL) in the header for outgoing  IPv4
              multicast  datagrams  in order to control the scope
              of the multicasts; for example:

              u_char ttl;     /* range: 0 to 255, default = 1  */
              setsockopt(s,  IPPROTO_IP,  IP_MULTICAST_TTL, &ttl,
              sizeof(ttl));

              Datagrams with a TTL of 1 are not forwarded  beyond
              the  local network.  Multicast datagrams with a TTL
              of 0 will not be transmitted on  any  network,  but
              may  be  delivered  locally  if  the  sending  host
              belongs to the destination group and  if  multicast
              loopback  has  not  been  disabled  on  the sending
              socket (see the IP_MULTICAST_LOOP option).   Multicast
  datagrams with TTL greater than 1 may be forwarded
 to other networks if a multicast  router  is
              attached to the local network.





   IPv6 Multicasting    [Toc]    [Back]
       The  following  IPv6  multicasting  options are supported:
       Joins an IPv6 multicast group on the specified  interface,
       for example:

              #include <netinet/in.h>

              struct ipv6_mreq imr6;

               imr6.ipv6mr_interface = if_index;
               if (setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP,
                           (char *)&imr6, sizeof(imr6)) < 0) {
                       perror("setsockopt IPV6_JOIN_GROUP");
               }

              The ipv6_mreq parameter is the following structure:

              struct ipv6_mreq {
                  struct in6_addr ipv6mr_multiaddr; /* IPv6  multicast
 address */
                  unsigned  int ipv6mr_interface;    /* interface
              index; 0 =>
                                              *  pick  a  default
              interface
                                               * that supports IP
              multicasts                            */ };

              The  ipv6mr_interface  should  be  either  zero  to
              choose  the  default  multicast  interface  or  the
              interface index of a particular  interface  if  the
              host  is multihomed.  Membership is associated with
              a single interface; programs running on  multihomed
              hosts  may need to join the same group on more than
              one interface.  Up  to  IPV6_MAX_MEMBERSHIPS  (currently
 65536) may be added to a single socket.

              IPv4-mapped IPv6 addresses are supported as parameters
 for this option.  Drops  a  membership  in  an
              IPv6 multicast group, for example:

              #include <netinet/in.h>

              struct ipv6_mreq imr6;

              if (setsockopt(s, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
                                      (char              *)&imr6,
              sizeof(imr6)) < 0) {
                       perror("setsockopt IPV6_LEAVE_GROUP"); }

              The imr6 parameter contains the same values as used
              to  add  the membership. IPv4-mapped IPv6 addresses
              are supported as valid parameters for this  option.
              Changes  the  hop limit for outgoing IPv6 multicast
              packets; for example:

              int hoplimit = 255; /* range 0 to 255; hop limit  =
              -1 sets the
                               * hoplimit to the default value of
              1
                               */ if (setsockopt(s, IPPROTO_IPV6,
              IPV6_MULTICAST_HOPS,
                          &hoplimit, sizeof(hoplimit)) < 0) {
                              perror("setsockopt      IPV6_MULTICAST_HOPS");
 } Sets the interface to use for outgoing
 IPv6 multicast packets:

              u_int if_index = 1;

              if  (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                        &if_index, sizeof(ifindex)) < 0)
                           perror("setsockopt         IPV6_MULTICAST_IF");
 }

              The  if_index  parameter  specifies  the  interface
              index of the desired interface or  0  to  select  a
              default  interface.   You  can use the if_nametoindex()
 routine to find the interface index.   Specifies
  whether  or not subsequent IPv6 datagrams are
              looped back, for example:

              u_int on = 0; /* 0 = disable, 1 = enable; default =
              1 */
                      if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,

                          &on, sizeof(on)) < 0){
                                      perror("setsockopt
              IPV6_MULTICAST_LOOP ");
                      }

              This  option  improves performance for applications
              that may have no more than one instance on a single
              host  (such as a router daemon), by eliminating the
              overhead  of  receiving  their  own  transmissions.
              However,  applications  for which there may be more
              than one instance on a single host (such as a  conferencing
 program) or for which the sender does not
              belong to the destination group (such  as  a  timequerying
  program)  generally  should  not use this
              option.

              An IPv6 multicast datagram sent with an initial hop
              limit  greater than 1 may be delivered to the sending
 host on a  different  interface  from  that  on
              which  it was sent, if the host belongs to the destination
 group on that other interface.  The  loopback
 control option has no effect on such delivery.

   Raw IP Sockets    [Toc]    [Back]
       Raw IP sockets are connectionless, and are  normally  used
       with  the  sendto()  and recvfrom() calls, though the connect()
 call may also be used to fix  the  destination  for
       future  packets,  in  which  case the read() or recv() and
       write() or send() functions may be used.

       If proto is 0 (zero), the default protocol IPPROTO_RAW  is
       used  for outgoing packets, and only incoming packets destined
 for that protocol are received. If proto is nonzero,
       that  protocol number will be used on outgoing packets and
       to filter incoming packets.

       For IPv4, outgoing packets automatically have an IP header
       prepended  to  them  (based on the destination address and
       the protocol number the socket is  created  with),  unless
       the IP_HDRINCL option is set.  The IP_HDRINCL option specifies
 whether the  IP  header  is  provided  by  the  sent
       packet.  Incoming  packets are received with IP header and
       options intact.




ERRORS    [Toc]    [Back]

       If a socket operation fails, errno may be set  to  one  of
       the  following  values:  An  attempt  was made to create a
       socket with a network address for which no network  interface
 exists.  The socket is already connected.  This error
       occurs when trying to establish connection on a socket  or
       when  trying  to  send  a  datagram  with  the destination
       address specified.  The system ran out of  memory  for  an
       internal  data  structure.   The  destination address of a
       datagram was not specified, and the socket  has  not  been
       connected.

       The following errors specific to IP may occur when setting
       or getting IP options: An unknown socket option  name  was
       given.

              The  IP  option  field  was  improperly  formed; an
              option field was shorter than the minimum value  or
              longer than the option buffer provided.

SEE ALSO    [Toc]    [Back]

      
      
       Functions: getsockopt(2), send(2), recv(2)

       Network Information: netintro(7), icmp(7), inet(7), tcp(7)



                                                            ip(7)
[ Back ]
 Similar pages
Name OS Title
ip6 OpenBSD Internet Protocol version 6 (IPv6)
ip6 FreeBSD Internet Protocol version 6 (IPv6)
icmp6 OpenBSD Internet Control Message Protocol for IPv6
icmp6 FreeBSD Internet Control Message Protocol for IPv6
ipv6sniff Tru64 Internet Protocol Version 6 (IPv6) search and analysis tool
if_faith FreeBSD IPv6-to-IPv4 TCP relay capturing interface
faith FreeBSD IPv6-to-IPv4 TCP relay capturing interface
faith OpenBSD IPv6-to-IPv4 TCP relay capturing interface
ip6addrctl FreeBSD configure address selection policy for IPv6 and IPv4
udp Linux User Datagram Protocol for IPv4
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service