LCOV - code coverage report
Current view: top level - usr/include/netinet - in.h (source / functions) Hit Total Coverage
Test: coverage report for abartlet/fix-coverage dd10fb34 Lines: 0 2 0.0 %
Date: 2021-09-23 10:06:22 Functions: 0 1 0.0 %

          Line data    Source code
       1             : /* Copyright (C) 1991-2018 Free Software Foundation, Inc.
       2             :    This file is part of the GNU C Library.
       3             : 
       4             :    The GNU C Library is free software; you can redistribute it and/or
       5             :    modify it under the terms of the GNU Lesser General Public
       6             :    License as published by the Free Software Foundation; either
       7             :    version 2.1 of the License, or (at your option) any later version.
       8             : 
       9             :    The GNU C Library is distributed in the hope that it will be useful,
      10             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12             :    Lesser General Public License for more details.
      13             : 
      14             :    You should have received a copy of the GNU Lesser General Public
      15             :    License along with the GNU C Library; if not, see
      16             :    <http://www.gnu.org/licenses/>.  */
      17             : 
      18             : #ifndef _NETINET_IN_H
      19             : #define _NETINET_IN_H   1
      20             : 
      21             : #include <features.h>
      22             : #include <bits/stdint-uintn.h>
      23             : #include <sys/socket.h>
      24             : #include <bits/types.h>
      25             : 
      26             : 
      27             : __BEGIN_DECLS
      28             : 
      29             : /* Internet address.  */
      30             : typedef uint32_t in_addr_t;
      31             : struct in_addr
      32             :   {
      33             :     in_addr_t s_addr;
      34             :   };
      35             : 
      36             : /* Get system-specific definitions.  */
      37             : #include <bits/in.h>
      38             : 
      39             : /* Standard well-defined IP protocols.  */
      40             : enum
      41             :   {
      42             :     IPPROTO_IP = 0,        /* Dummy protocol for TCP.  */
      43             : #define IPPROTO_IP              IPPROTO_IP
      44             :     IPPROTO_ICMP = 1,      /* Internet Control Message Protocol.  */
      45             : #define IPPROTO_ICMP            IPPROTO_ICMP
      46             :     IPPROTO_IGMP = 2,      /* Internet Group Management Protocol. */
      47             : #define IPPROTO_IGMP            IPPROTO_IGMP
      48             :     IPPROTO_IPIP = 4,      /* IPIP tunnels (older KA9Q tunnels use 94).  */
      49             : #define IPPROTO_IPIP            IPPROTO_IPIP
      50             :     IPPROTO_TCP = 6,       /* Transmission Control Protocol.  */
      51             : #define IPPROTO_TCP             IPPROTO_TCP
      52             :     IPPROTO_EGP = 8,       /* Exterior Gateway Protocol.  */
      53             : #define IPPROTO_EGP             IPPROTO_EGP
      54             :     IPPROTO_PUP = 12,      /* PUP protocol.  */
      55             : #define IPPROTO_PUP             IPPROTO_PUP
      56             :     IPPROTO_UDP = 17,      /* User Datagram Protocol.  */
      57             : #define IPPROTO_UDP             IPPROTO_UDP
      58             :     IPPROTO_IDP = 22,      /* XNS IDP protocol.  */
      59             : #define IPPROTO_IDP             IPPROTO_IDP
      60             :     IPPROTO_TP = 29,       /* SO Transport Protocol Class 4.  */
      61             : #define IPPROTO_TP              IPPROTO_TP
      62             :     IPPROTO_DCCP = 33,     /* Datagram Congestion Control Protocol.  */
      63             : #define IPPROTO_DCCP            IPPROTO_DCCP
      64             :     IPPROTO_IPV6 = 41,     /* IPv6 header.  */
      65             : #define IPPROTO_IPV6            IPPROTO_IPV6
      66             :     IPPROTO_RSVP = 46,     /* Reservation Protocol.  */
      67             : #define IPPROTO_RSVP            IPPROTO_RSVP
      68             :     IPPROTO_GRE = 47,      /* General Routing Encapsulation.  */
      69             : #define IPPROTO_GRE             IPPROTO_GRE
      70             :     IPPROTO_ESP = 50,      /* encapsulating security payload.  */
      71             : #define IPPROTO_ESP             IPPROTO_ESP
      72             :     IPPROTO_AH = 51,       /* authentication header.  */
      73             : #define IPPROTO_AH              IPPROTO_AH
      74             :     IPPROTO_MTP = 92,      /* Multicast Transport Protocol.  */
      75             : #define IPPROTO_MTP             IPPROTO_MTP
      76             :     IPPROTO_BEETPH = 94,   /* IP option pseudo header for BEET.  */
      77             : #define IPPROTO_BEETPH          IPPROTO_BEETPH
      78             :     IPPROTO_ENCAP = 98,    /* Encapsulation Header.  */
      79             : #define IPPROTO_ENCAP           IPPROTO_ENCAP
      80             :     IPPROTO_PIM = 103,     /* Protocol Independent Multicast.  */
      81             : #define IPPROTO_PIM             IPPROTO_PIM
      82             :     IPPROTO_COMP = 108,    /* Compression Header Protocol.  */
      83             : #define IPPROTO_COMP            IPPROTO_COMP
      84             :     IPPROTO_SCTP = 132,    /* Stream Control Transmission Protocol.  */
      85             : #define IPPROTO_SCTP            IPPROTO_SCTP
      86             :     IPPROTO_UDPLITE = 136, /* UDP-Lite protocol.  */
      87             : #define IPPROTO_UDPLITE         IPPROTO_UDPLITE
      88             :     IPPROTO_MPLS = 137,    /* MPLS in IP.  */
      89             : #define IPPROTO_MPLS            IPPROTO_MPLS
      90             :     IPPROTO_RAW = 255,     /* Raw IP packets.  */
      91             : #define IPPROTO_RAW             IPPROTO_RAW
      92             :     IPPROTO_MAX
      93             :   };
      94             : 
      95             : /* If __USE_KERNEL_IPV6_DEFS is 1 then the user has included the kernel
      96             :    network headers first and we should use those ABI-identical definitions
      97             :    instead of our own, otherwise 0.  */
      98             : #if !__USE_KERNEL_IPV6_DEFS
      99             : enum
     100             :   {
     101             :     IPPROTO_HOPOPTS = 0,   /* IPv6 Hop-by-Hop options.  */
     102             : #define IPPROTO_HOPOPTS         IPPROTO_HOPOPTS
     103             :     IPPROTO_ROUTING = 43,  /* IPv6 routing header.  */
     104             : #define IPPROTO_ROUTING         IPPROTO_ROUTING
     105             :     IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header.  */
     106             : #define IPPROTO_FRAGMENT        IPPROTO_FRAGMENT
     107             :     IPPROTO_ICMPV6 = 58,   /* ICMPv6.  */
     108             : #define IPPROTO_ICMPV6          IPPROTO_ICMPV6
     109             :     IPPROTO_NONE = 59,     /* IPv6 no next header.  */
     110             : #define IPPROTO_NONE            IPPROTO_NONE
     111             :     IPPROTO_DSTOPTS = 60,  /* IPv6 destination options.  */
     112             : #define IPPROTO_DSTOPTS         IPPROTO_DSTOPTS
     113             :     IPPROTO_MH = 135       /* IPv6 mobility header.  */
     114             : #define IPPROTO_MH              IPPROTO_MH
     115             :   };
     116             : #endif /* !__USE_KERNEL_IPV6_DEFS */
     117             : 
     118             : /* Type to represent a port.  */
     119             : typedef uint16_t in_port_t;
     120             : 
     121             : /* Standard well-known ports.  */
     122             : enum
     123             :   {
     124             :     IPPORT_ECHO = 7,            /* Echo service.  */
     125             :     IPPORT_DISCARD = 9,         /* Discard transmissions service.  */
     126             :     IPPORT_SYSTAT = 11,         /* System status service.  */
     127             :     IPPORT_DAYTIME = 13,        /* Time of day service.  */
     128             :     IPPORT_NETSTAT = 15,        /* Network status service.  */
     129             :     IPPORT_FTP = 21,            /* File Transfer Protocol.  */
     130             :     IPPORT_TELNET = 23,         /* Telnet protocol.  */
     131             :     IPPORT_SMTP = 25,           /* Simple Mail Transfer Protocol.  */
     132             :     IPPORT_TIMESERVER = 37,     /* Timeserver service.  */
     133             :     IPPORT_NAMESERVER = 42,     /* Domain Name Service.  */
     134             :     IPPORT_WHOIS = 43,          /* Internet Whois service.  */
     135             :     IPPORT_MTP = 57,
     136             : 
     137             :     IPPORT_TFTP = 69,           /* Trivial File Transfer Protocol.  */
     138             :     IPPORT_RJE = 77,
     139             :     IPPORT_FINGER = 79,         /* Finger service.  */
     140             :     IPPORT_TTYLINK = 87,
     141             :     IPPORT_SUPDUP = 95,         /* SUPDUP protocol.  */
     142             : 
     143             : 
     144             :     IPPORT_EXECSERVER = 512,    /* execd service.  */
     145             :     IPPORT_LOGINSERVER = 513,   /* rlogind service.  */
     146             :     IPPORT_CMDSERVER = 514,
     147             :     IPPORT_EFSSERVER = 520,
     148             : 
     149             :     /* UDP ports.  */
     150             :     IPPORT_BIFFUDP = 512,
     151             :     IPPORT_WHOSERVER = 513,
     152             :     IPPORT_ROUTESERVER = 520,
     153             : 
     154             :     /* Ports less than this value are reserved for privileged processes.  */
     155             :     IPPORT_RESERVED = 1024,
     156             : 
     157             :     /* Ports greater this value are reserved for (non-privileged) servers.  */
     158             :     IPPORT_USERRESERVED = 5000
     159             :   };
     160             : 
     161             : /* Definitions of the bits in an Internet address integer.
     162             : 
     163             :    On subnets, host and network parts are found according to
     164             :    the subnet mask, not these masks.  */
     165             : 
     166             : #define IN_CLASSA(a)            ((((in_addr_t)(a)) & 0x80000000) == 0)
     167             : #define IN_CLASSA_NET           0xff000000
     168             : #define IN_CLASSA_NSHIFT        24
     169             : #define IN_CLASSA_HOST          (0xffffffff & ~IN_CLASSA_NET)
     170             : #define IN_CLASSA_MAX           128
     171             : 
     172             : #define IN_CLASSB(a)            ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
     173             : #define IN_CLASSB_NET           0xffff0000
     174             : #define IN_CLASSB_NSHIFT        16
     175             : #define IN_CLASSB_HOST          (0xffffffff & ~IN_CLASSB_NET)
     176             : #define IN_CLASSB_MAX           65536
     177             : 
     178             : #define IN_CLASSC(a)            ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
     179             : #define IN_CLASSC_NET           0xffffff00
     180             : #define IN_CLASSC_NSHIFT        8
     181             : #define IN_CLASSC_HOST          (0xffffffff & ~IN_CLASSC_NET)
     182             : 
     183             : #define IN_CLASSD(a)            ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
     184             : #define IN_MULTICAST(a)         IN_CLASSD(a)
     185             : 
     186             : #define IN_EXPERIMENTAL(a)      ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
     187             : #define IN_BADCLASS(a)          ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
     188             : 
     189             : /* Address to accept any incoming messages.  */
     190             : #define INADDR_ANY              ((in_addr_t) 0x00000000)
     191             : /* Address to send to all hosts.  */
     192             : #define INADDR_BROADCAST        ((in_addr_t) 0xffffffff)
     193             : /* Address indicating an error return.  */
     194             : #define INADDR_NONE             ((in_addr_t) 0xffffffff)
     195             : 
     196             : /* Network number for local host loopback.  */
     197             : #define IN_LOOPBACKNET          127
     198             : /* Address to loopback in software to local host.  */
     199             : #ifndef INADDR_LOOPBACK
     200             : # define INADDR_LOOPBACK        ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1.  */
     201             : #endif
     202             : 
     203             : /* Defines for Multicast INADDR.  */
     204             : #define INADDR_UNSPEC_GROUP     ((in_addr_t) 0xe0000000) /* 224.0.0.0 */
     205             : #define INADDR_ALLHOSTS_GROUP   ((in_addr_t) 0xe0000001) /* 224.0.0.1 */
     206             : #define INADDR_ALLRTRS_GROUP    ((in_addr_t) 0xe0000002) /* 224.0.0.2 */
     207             : #define INADDR_MAX_LOCAL_GROUP  ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
     208             : 
     209             : #if !__USE_KERNEL_IPV6_DEFS
     210             : /* IPv6 address */
     211             : struct in6_addr
     212             :   {
     213             :     union
     214             :       {
     215             :         uint8_t __u6_addr8[16];
     216             :         uint16_t __u6_addr16[8];
     217             :         uint32_t __u6_addr32[4];
     218             :       } __in6_u;
     219             : #define s6_addr                 __in6_u.__u6_addr8
     220             : #ifdef __USE_MISC
     221             : # define s6_addr16              __in6_u.__u6_addr16
     222             : # define s6_addr32              __in6_u.__u6_addr32
     223             : #endif
     224             :   };
     225             : #endif /* !__USE_KERNEL_IPV6_DEFS */
     226             : 
     227             : extern const struct in6_addr in6addr_any;        /* :: */
     228             : extern const struct in6_addr in6addr_loopback;   /* ::1 */
     229             : #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
     230             : #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
     231             : 
     232             : #define INET_ADDRSTRLEN 16
     233             : #define INET6_ADDRSTRLEN 46
     234             : 
     235             : 
     236             : /* Structure describing an Internet socket address.  */
     237             : struct sockaddr_in
     238             :   {
     239             :     __SOCKADDR_COMMON (sin_);
     240             :     in_port_t sin_port;                 /* Port number.  */
     241             :     struct in_addr sin_addr;            /* Internet address.  */
     242             : 
     243             :     /* Pad to size of `struct sockaddr'.  */
     244             :     unsigned char sin_zero[sizeof (struct sockaddr) -
     245             :                            __SOCKADDR_COMMON_SIZE -
     246             :                            sizeof (in_port_t) -
     247             :                            sizeof (struct in_addr)];
     248             :   };
     249             : 
     250             : #if !__USE_KERNEL_IPV6_DEFS
     251             : /* Ditto, for IPv6.  */
     252             : struct sockaddr_in6
     253             :   {
     254             :     __SOCKADDR_COMMON (sin6_);
     255             :     in_port_t sin6_port;        /* Transport layer port # */
     256             :     uint32_t sin6_flowinfo;     /* IPv6 flow information */
     257             :     struct in6_addr sin6_addr;  /* IPv6 address */
     258             :     uint32_t sin6_scope_id;     /* IPv6 scope-id */
     259             :   };
     260             : #endif /* !__USE_KERNEL_IPV6_DEFS */
     261             : 
     262             : #ifdef __USE_MISC
     263             : /* IPv4 multicast request.  */
     264             : struct ip_mreq
     265             :   {
     266             :     /* IP multicast address of group.  */
     267             :     struct in_addr imr_multiaddr;
     268             : 
     269             :     /* Local IP address of interface.  */
     270             :     struct in_addr imr_interface;
     271             :   };
     272             : 
     273             : struct ip_mreq_source
     274             :   {
     275             :     /* IP multicast address of group.  */
     276             :     struct in_addr imr_multiaddr;
     277             : 
     278             :     /* IP address of interface.  */
     279             :     struct in_addr imr_interface;
     280             : 
     281             :     /* IP address of source.  */
     282             :     struct in_addr imr_sourceaddr;
     283             :   };
     284             : #endif
     285             : 
     286             : #if !__USE_KERNEL_IPV6_DEFS
     287             : /* Likewise, for IPv6.  */
     288             : struct ipv6_mreq
     289             :   {
     290             :     /* IPv6 multicast address of group */
     291             :     struct in6_addr ipv6mr_multiaddr;
     292             : 
     293             :     /* local interface */
     294             :     unsigned int ipv6mr_interface;
     295             :   };
     296             : #endif /* !__USE_KERNEL_IPV6_DEFS */
     297             : 
     298             : #ifdef __USE_MISC
     299             : /* Multicast group request.  */
     300             : struct group_req
     301             :   {
     302             :     /* Interface index.  */
     303             :     uint32_t gr_interface;
     304             : 
     305             :     /* Group address.  */
     306             :     struct sockaddr_storage gr_group;
     307             :   };
     308             : 
     309             : struct group_source_req
     310             :   {
     311             :     /* Interface index.  */
     312             :     uint32_t gsr_interface;
     313             : 
     314             :     /* Group address.  */
     315             :     struct sockaddr_storage gsr_group;
     316             : 
     317             :     /* Source address.  */
     318             :     struct sockaddr_storage gsr_source;
     319             :   };
     320             : 
     321             : 
     322             : /* Full-state filter operations.  */
     323             : struct ip_msfilter
     324             :   {
     325             :     /* IP multicast address of group.  */
     326             :     struct in_addr imsf_multiaddr;
     327             : 
     328             :     /* Local IP address of interface.  */
     329             :     struct in_addr imsf_interface;
     330             : 
     331             :     /* Filter mode.  */
     332             :     uint32_t imsf_fmode;
     333             : 
     334             :     /* Number of source addresses.  */
     335             :     uint32_t imsf_numsrc;
     336             :     /* Source addresses.  */
     337             :     struct in_addr imsf_slist[1];
     338             :   };
     339             : 
     340             : #define IP_MSFILTER_SIZE(numsrc) (sizeof (struct ip_msfilter) \
     341             :                                   - sizeof (struct in_addr)                   \
     342             :                                   + (numsrc) * sizeof (struct in_addr))
     343             : 
     344             : struct group_filter
     345             :   {
     346             :     /* Interface index.  */
     347             :     uint32_t gf_interface;
     348             : 
     349             :     /* Group address.  */
     350             :     struct sockaddr_storage gf_group;
     351             : 
     352             :     /* Filter mode.  */
     353             :     uint32_t gf_fmode;
     354             : 
     355             :     /* Number of source addresses.  */
     356             :     uint32_t gf_numsrc;
     357             :     /* Source addresses.  */
     358             :     struct sockaddr_storage gf_slist[1];
     359             : };
     360             : 
     361             : #define GROUP_FILTER_SIZE(numsrc) (sizeof (struct group_filter) \
     362             :                                    - sizeof (struct sockaddr_storage)         \
     363             :                                    + ((numsrc)                                \
     364             :                                       * sizeof (struct sockaddr_storage)))
     365             : #endif
     366             : 
     367             : /* Functions to convert between host and network byte order.
     368             : 
     369             :    Please note that these functions normally take `unsigned long int' or
     370             :    `unsigned short int' values as arguments and also return them.  But
     371             :    this was a short-sighted decision since on different systems the types
     372             :    may have different representations but the values are always the same.  */
     373             : 
     374             : extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
     375             : extern uint16_t ntohs (uint16_t __netshort)
     376             :      __THROW __attribute__ ((__const__));
     377             : extern uint32_t htonl (uint32_t __hostlong)
     378             :      __THROW __attribute__ ((__const__));
     379             : extern uint16_t htons (uint16_t __hostshort)
     380             :      __THROW __attribute__ ((__const__));
     381             : 
     382             : #include <endian.h>
     383             : 
     384             : /* Get machine dependent optimized versions of byte swapping functions.  */
     385             : #include <bits/byteswap.h>
     386             : #include <bits/uintn-identity.h>
     387             : 
     388             : #ifdef __OPTIMIZE__
     389             : /* We can optimize calls to the conversion functions.  Either nothing has
     390             :    to be done or we are using directly the byte-swapping functions which
     391             :    often can be inlined.  */
     392             : # if __BYTE_ORDER == __BIG_ENDIAN
     393             : /* The host byte order is the same as network byte order,
     394             :    so these functions are all just identity.  */
     395             : # define ntohl(x)       __uint32_identity (x)
     396             : # define ntohs(x)       __uint16_identity (x)
     397             : # define htonl(x)       __uint32_identity (x)
     398             : # define htons(x)       __uint16_identity (x)
     399             : # else
     400             : #  if __BYTE_ORDER == __LITTLE_ENDIAN
     401             : #   define ntohl(x)     __bswap_32 (x)
     402             : #   define ntohs(x)     __bswap_16 (x)
     403             : #   define htonl(x)     __bswap_32 (x)
     404             : #   define htons(x)     __bswap_16 (x)
     405             : #  endif
     406             : # endif
     407             : #endif
     408             : 
     409             : #ifdef __GNUC__
     410             : # define IN6_IS_ADDR_UNSPECIFIED(a) \
     411             :   (__extension__                                                              \
     412             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     413             :       __a->__in6_u.__u6_addr32[0] == 0                                             \
     414             :       && __a->__in6_u.__u6_addr32[1] == 0                                  \
     415             :       && __a->__in6_u.__u6_addr32[2] == 0                                  \
     416             :       && __a->__in6_u.__u6_addr32[3] == 0; }))
     417             : 
     418             : # define IN6_IS_ADDR_LOOPBACK(a) \
     419             :   (__extension__                                                              \
     420             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     421             :       __a->__in6_u.__u6_addr32[0] == 0                                             \
     422             :       && __a->__in6_u.__u6_addr32[1] == 0                                  \
     423             :       && __a->__in6_u.__u6_addr32[2] == 0                                  \
     424             :       && __a->__in6_u.__u6_addr32[3] == htonl (1); }))
     425             : 
     426             : # define IN6_IS_ADDR_LINKLOCAL(a) \
     427             :   (__extension__                                                              \
     428             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     429             :       (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
     430             : 
     431             : # define IN6_IS_ADDR_SITELOCAL(a) \
     432             :   (__extension__                                                              \
     433             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     434             :       (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
     435             : 
     436             : # define IN6_IS_ADDR_V4MAPPED(a) \
     437             :   (__extension__                                                              \
     438             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     439             :       __a->__in6_u.__u6_addr32[0] == 0                                             \
     440             :       && __a->__in6_u.__u6_addr32[1] == 0                                  \
     441             :       && __a->__in6_u.__u6_addr32[2] == htonl (0xffff); }))
     442             : 
     443             : # define IN6_IS_ADDR_V4COMPAT(a) \
     444             :   (__extension__                                                              \
     445             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     446             :       __a->__in6_u.__u6_addr32[0] == 0                                             \
     447             :       && __a->__in6_u.__u6_addr32[1] == 0                                  \
     448             :       && __a->__in6_u.__u6_addr32[2] == 0                                  \
     449             :       && ntohl (__a->__in6_u.__u6_addr32[3]) > 1; }))
     450             : 
     451             : # define IN6_ARE_ADDR_EQUAL(a,b) \
     452             :   (__extension__                                                              \
     453             :    ({ const struct in6_addr *__a = (const struct in6_addr *) (a);             \
     454             :       const struct in6_addr *__b = (const struct in6_addr *) (b);             \
     455             :       __a->__in6_u.__u6_addr32[0] == __b->__in6_u.__u6_addr32[0]        \
     456             :       && __a->__in6_u.__u6_addr32[1] == __b->__in6_u.__u6_addr32[1]             \
     457             :       && __a->__in6_u.__u6_addr32[2] == __b->__in6_u.__u6_addr32[2]             \
     458             :       && __a->__in6_u.__u6_addr32[3] == __b->__in6_u.__u6_addr32[3]; }))
     459             : #else
     460             : # define IN6_IS_ADDR_UNSPECIFIED(a) \
     461             :         (((const uint32_t *) (a))[0] == 0                                     \
     462             :          && ((const uint32_t *) (a))[1] == 0                                  \
     463             :          && ((const uint32_t *) (a))[2] == 0                                  \
     464             :          && ((const uint32_t *) (a))[3] == 0)
     465             : 
     466             : # define IN6_IS_ADDR_LOOPBACK(a) \
     467             :         (((const uint32_t *) (a))[0] == 0                                     \
     468             :          && ((const uint32_t *) (a))[1] == 0                                  \
     469             :          && ((const uint32_t *) (a))[2] == 0                                  \
     470             :          && ((const uint32_t *) (a))[3] == htonl (1))
     471             : 
     472             : # define IN6_IS_ADDR_LINKLOCAL(a) \
     473             :         ((((const uint32_t *) (a))[0] & htonl (0xffc00000))               \
     474             :          == htonl (0xfe800000))
     475             : 
     476             : # define IN6_IS_ADDR_SITELOCAL(a) \
     477             :         ((((const uint32_t *) (a))[0] & htonl (0xffc00000))               \
     478             :          == htonl (0xfec00000))
     479             : 
     480             : # define IN6_IS_ADDR_V4MAPPED(a) \
     481             :         ((((const uint32_t *) (a))[0] == 0)                                   \
     482             :          && (((const uint32_t *) (a))[1] == 0)                                \
     483             :          && (((const uint32_t *) (a))[2] == htonl (0xffff)))
     484             : 
     485             : # define IN6_IS_ADDR_V4COMPAT(a) \
     486             :         ((((const uint32_t *) (a))[0] == 0)                                   \
     487             :          && (((const uint32_t *) (a))[1] == 0)                                \
     488             :          && (((const uint32_t *) (a))[2] == 0)                                \
     489             :          && (ntohl (((const uint32_t *) (a))[3]) > 1))
     490             : 
     491             : # define IN6_ARE_ADDR_EQUAL(a,b) \
     492             :         ((((const uint32_t *) (a))[0] == ((const uint32_t *) (b))[0])         \
     493             :          && (((const uint32_t *) (a))[1] == ((const uint32_t *) (b))[1])      \
     494             :          && (((const uint32_t *) (a))[2] == ((const uint32_t *) (b))[2])      \
     495             :          && (((const uint32_t *) (a))[3] == ((const uint32_t *) (b))[3]))
     496             : #endif
     497             : 
     498             : #define IN6_IS_ADDR_MULTICAST(a) (((const uint8_t *) (a))[0] == 0xff)
     499             : 
     500             : #ifdef __USE_MISC
     501             : /* Bind socket to a privileged IP port.  */
     502           0 : extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) __THROW;
     503             : 
     504             : /* The IPv6 version of this function.  */
     505             : extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
     506             :      __THROW;
     507           0 : #endif
     508             : 
     509             : 
     510             : #define IN6_IS_ADDR_MC_NODELOCAL(a) \
     511             :         (IN6_IS_ADDR_MULTICAST(a)                                             \
     512             :          && ((((const uint8_t *) (a))[1] & 0xf) == 0x1))
     513             : 
     514             : #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
     515             :         (IN6_IS_ADDR_MULTICAST(a)                                             \
     516             :          && ((((const uint8_t *) (a))[1] & 0xf) == 0x2))
     517             : 
     518             : #define IN6_IS_ADDR_MC_SITELOCAL(a) \
     519             :         (IN6_IS_ADDR_MULTICAST(a)                                             \
     520             :          && ((((const uint8_t *) (a))[1] & 0xf) == 0x5))
     521             : 
     522             : #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
     523             :         (IN6_IS_ADDR_MULTICAST(a)                                             \
     524             :          && ((((const uint8_t *) (a))[1] & 0xf) == 0x8))
     525             : 
     526             : #define IN6_IS_ADDR_MC_GLOBAL(a) \
     527             :         (IN6_IS_ADDR_MULTICAST(a)                                             \
     528             :          && ((((const uint8_t *) (a))[1] & 0xf) == 0xe))
     529             : 
     530             : 
     531             : #ifdef __USE_GNU
     532             : struct cmsghdr;                 /* Forward declaration.  */
     533             : 
     534             : #if !__USE_KERNEL_IPV6_DEFS
     535             : /* IPv6 packet information.  */
     536             : struct in6_pktinfo
     537             :   {
     538             :     struct in6_addr ipi6_addr;  /* src/dst IPv6 address */
     539             :     unsigned int ipi6_ifindex;  /* send/recv interface index */
     540             :   };
     541             : 
     542             : /* IPv6 MTU information.  */
     543             : struct ip6_mtuinfo
     544             :   {
     545             :     struct sockaddr_in6 ip6m_addr; /* dst address including zone ID */
     546             :     uint32_t ip6m_mtu;             /* path MTU in host byte order */
     547             :   };
     548             : #endif /* !__USE_KERNEL_IPV6_DEFS */
     549             : 
     550             : /* Obsolete hop-by-hop and Destination Options Processing (RFC 2292).  */
     551             : extern int inet6_option_space (int __nbytes)
     552             :      __THROW __attribute_deprecated__;
     553             : extern int inet6_option_init (void *__bp, struct cmsghdr **__cmsgp,
     554             :                               int __type) __THROW __attribute_deprecated__;
     555             : extern int inet6_option_append (struct cmsghdr *__cmsg,
     556             :                                 const uint8_t *__typep, int __multx,
     557             :                                 int __plusy) __THROW __attribute_deprecated__;
     558             : extern uint8_t *inet6_option_alloc (struct cmsghdr *__cmsg, int __datalen,
     559             :                                     int __multx, int __plusy)
     560             :      __THROW __attribute_deprecated__;
     561             : extern int inet6_option_next (const struct cmsghdr *__cmsg,
     562             :                               uint8_t **__tptrp)
     563             :      __THROW __attribute_deprecated__;
     564             : extern int inet6_option_find (const struct cmsghdr *__cmsg,
     565             :                               uint8_t **__tptrp, int __type)
     566             :      __THROW __attribute_deprecated__;
     567             : 
     568             : 
     569             : /* Hop-by-Hop and Destination Options Processing (RFC 3542).  */
     570             : extern int inet6_opt_init (void *__extbuf, socklen_t __extlen) __THROW;
     571             : extern int inet6_opt_append (void *__extbuf, socklen_t __extlen, int __offset,
     572             :                              uint8_t __type, socklen_t __len, uint8_t __align,
     573             :                              void **__databufp) __THROW;
     574             : extern int inet6_opt_finish (void *__extbuf, socklen_t __extlen, int __offset)
     575             :      __THROW;
     576             : extern int inet6_opt_set_val (void *__databuf, int __offset, void *__val,
     577             :                               socklen_t __vallen) __THROW;
     578             : extern int inet6_opt_next (void *__extbuf, socklen_t __extlen, int __offset,
     579             :                            uint8_t *__typep, socklen_t *__lenp,
     580             :                            void **__databufp) __THROW;
     581             : extern int inet6_opt_find (void *__extbuf, socklen_t __extlen, int __offset,
     582             :                            uint8_t __type, socklen_t *__lenp,
     583             :                            void **__databufp) __THROW;
     584             : extern int inet6_opt_get_val (void *__databuf, int __offset, void *__val,
     585             :                               socklen_t __vallen) __THROW;
     586             : 
     587             : 
     588             : /* Routing Header Option (RFC 3542).  */
     589             : extern socklen_t inet6_rth_space (int __type, int __segments) __THROW;
     590             : extern void *inet6_rth_init (void *__bp, socklen_t __bp_len, int __type,
     591             :                              int __segments) __THROW;
     592             : extern int inet6_rth_add (void *__bp, const struct in6_addr *__addr) __THROW;
     593             : extern int inet6_rth_reverse (const void *__in, void *__out) __THROW;
     594             : extern int inet6_rth_segments (const void *__bp) __THROW;
     595             : extern struct in6_addr *inet6_rth_getaddr (const void *__bp, int __index)
     596             :      __THROW;
     597             : 
     598             : 
     599             : /* Multicast source filter support.  */
     600             : 
     601             : /* Get IPv4 source filter.  */
     602             : extern int getipv4sourcefilter (int __s, struct in_addr __interface_addr,
     603             :                                 struct in_addr __group, uint32_t *__fmode,
     604             :                                 uint32_t *__numsrc, struct in_addr *__slist)
     605             :      __THROW;
     606             : 
     607             : /* Set IPv4 source filter.  */
     608             : extern int setipv4sourcefilter (int __s, struct in_addr __interface_addr,
     609             :                                 struct in_addr __group, uint32_t __fmode,
     610             :                                 uint32_t __numsrc,
     611             :                                 const struct in_addr *__slist)
     612             :      __THROW;
     613             : 
     614             : 
     615             : /* Get source filter.  */
     616             : extern int getsourcefilter (int __s, uint32_t __interface_addr,
     617             :                             const struct sockaddr *__group,
     618             :                             socklen_t __grouplen, uint32_t *__fmode,
     619             :                             uint32_t *__numsrc,
     620             :                             struct sockaddr_storage *__slist) __THROW;
     621             : 
     622             : /* Set source filter.  */
     623             : extern int setsourcefilter (int __s, uint32_t __interface_addr,
     624             :                             const struct sockaddr *__group,
     625             :                             socklen_t __grouplen, uint32_t __fmode,
     626             :                             uint32_t __numsrc,
     627             :                             const struct sockaddr_storage *__slist) __THROW;
     628             : #endif  /* use GNU */
     629             : 
     630             : __END_DECLS
     631             : 
     632             : #endif  /* netinet/in.h */

Generated by: LCOV version 1.13