LCOV - code coverage report
Current view: top level - usr/include/netinet - in.h (source / functions) Hit Total Coverage
Test: coverage report for master 2b515b7d Lines: 0 2 0.0 %
Date: 2024-02-28 12:06:22 Functions: 0 1 0.0 %

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

Generated by: LCOV version 1.14