NAME

  tst_wild_addr - IPv6 Wildcard Address


PURPOSE

  Check the IPv6 Wildcard Address can workd


SYNOPSIS

  ./tst_addr_and_pro_family [-tooloption ...]
    -tooloption : v6api tool option


TEST PROCEDURE

  1. Test in6addr_any
  2. Test IN6ADDR_ANY_INIT


NOTE

  None


REFERENCE

  RFC 3493
    3.8 IPv6 Wildcard Address
  
     While the bind() function allows applications to select the source IP
     address of UDP packets and TCP connections, applications often want
     the system to select the source address for them.  With IPv4, one
     specifies the address as the symbolic constant INADDR_ANY (called the
     "wildcard" address) in the bind() call, or simply omits the bind()
     entirely.
  
     Since the IPv6 address type is a structure (struct in6_addr), a
     symbolic constant can be used to initialize an IPv6 address variable,
     but cannot be used in an assignment.  Therefore systems provide the
     IPv6 wildcard address in two forms.
  
     The first version is a global variable named "in6addr_any" that is an
     in6_addr structure.  The extern declaration for this variable is
     defined in <netinet/in.h>:
  
        extern const struct in6_addr in6addr_any;
  
     Applications use in6addr_any similarly to the way they use INADDR_ANY
     in IPv4.  For example, to bind a socket to port number 23, but let
     the system select the source address, an application could use the
     following code:
  
        struct sockaddr_in6 sin6;
         . . .
        sin6.sin6_family = AF_INET6;
        sin6.sin6_flowinfo = 0;
        sin6.sin6_port = htons(23);
        sin6.sin6_addr = in6addr_any;  /* structure assignment */
         . . .
        if (bind(s, (struct sockaddr *) &sin6, sizeof(sin6)) == -1)
                . . .
  
     The other version is a symbolic constant named IN6ADDR_ANY_INIT and
     is defined in <netinet/in.h>.  This constant can be used to
     initialize an in6_addr structure:
  
        struct in6_addr anyaddr = IN6ADDR_ANY_INIT;
  
     Note that this constant can be used ONLY at declaration time.  It can
     not be used to assign a previously declared in6_addr structure.  For
     example, the following code will not work:
  
        /* This is the WRONG way to assign an unspecified address */
        struct sockaddr_in6 sin6;
         . . .
        sin6.sin6_addr = IN6ADDR_ANY_INIT; /* will NOT compile */
  
     Be aware that the IPv4 INADDR_xxx constants are all defined in host
     byte order but the IPv6 IN6ADDR_xxx constants and the IPv6
     in6addr_xxx externals are defined in network byte order.