ipv6.h revision 79a6a33184abff1999ba13b10922ccb34a2758a5
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Copyright (C) 1999-2001 Internet Software Consortium.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Permission to use, copy, modify, and distribute this software for any
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * purpose with or without fee is hereby granted, provided that the above
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * copyright notice and this permission notice appear in all copies.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
cbb94d52f98b48e8c3a8866dbf8c67860764f349Mark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/* $Id: ipv6.h,v 1.19 2002/04/03 06:38:33 marka Exp $ */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#ifndef ISC_IPV6_H
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define ISC_IPV6_H 1
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
648ba62b1f156cbca14d54d06c535385f1193d13Mark Andrews/*
648ba62b1f156cbca14d54d06c535385f1193d13Mark Andrews * Also define LWRES_IPV6_H to keep it from being included if liblwres is
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * being used, or redefinition errors will occur.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define LWRES_IPV6_H 1
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*****
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ***** Module Info
35665db4e49e3e4c0e3776e635449f931f3732cfMark Andrews *****/
c6313caa6cd9d011ac075048d2b62fd3410162dfMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * IPv6 definitions for systems which do not support IPv6.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * MP:
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * No impact.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
64cde9d94a2f6c7050f00d9651df6b05e63d09f2Mark Andrews * Reliability:
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * No anticipated impact.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
64cde9d94a2f6c7050f00d9651df6b05e63d09f2Mark Andrews * Resources:
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * N/A.
cbb94d52f98b48e8c3a8866dbf8c67860764f349Mark Andrews *
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Security:
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * No anticipated impact.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Standards:
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * RFC 2553.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/***
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *** Imports.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ***/
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#include <isc/int.h>
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#include <isc/platform.h>
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/***
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews *** Types.
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ***/
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrewsstruct in6_addr {
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews union {
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint8_t _S6_u8[16];
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint16_t _S6_u16[8];
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint32_t _S6_u32[4];
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews } _S6_un;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews};
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define s6_addr _S6_un._S6_u8
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define s6_addr8 _S6_un._S6_u8
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define s6_addr16 _S6_un._S6_u16
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define s6_addr32 _S6_un._S6_u32
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6ADDR_ANY_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}}
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6ADDR_LOOPBACK_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}}
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark AndrewsLIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_any;
d9b4174233b951f25cd53a2787b9f14314258c2fMark AndrewsLIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrewsstruct sockaddr_in6 {
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#ifdef ISC_PLATFORM_HAVESALEN
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint8_t sin6_len;
c6313caa6cd9d011ac075048d2b62fd3410162dfMark Andrews isc_uint8_t sin6_family;
c6313caa6cd9d011ac075048d2b62fd3410162dfMark Andrews#else
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint16_t sin6_family;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#endif
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint16_t sin6_port;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint32_t sin6_flowinfo;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews struct in6_addr sin6_addr;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews isc_uint32_t sin6_scope_id;
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews};
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#ifdef ISC_PLATFORM_HAVESALEN
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define SIN6_LEN 1
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#endif
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Unspecified
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6_IS_ADDR_UNSPECIFIED(a) \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews (((a)->s6_addr32[0] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[1] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[2] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[3] == 0))
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Loopback
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6_IS_ADDR_LOOPBACK(a) \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews (((a)->s6_addr32[0] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[1] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[2] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[3] == htonl(1)))
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * IPv4 compatible
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6_IS_ADDR_V4COMPAT(a) \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews (((a)->s6_addr32[0] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[1] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[2] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[3] != 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[3] != htonl(1)))
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Mapped
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews#define IN6_IS_ADDR_V4MAPPED(a) \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews (((a)->s6_addr32[0] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[1] == 0) && \
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews ((a)->s6_addr32[2] == htonl(0x0000ffff)))
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews * Multicast
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews */
648ba62b1f156cbca14d54d06c535385f1193d13Mark Andrews#define IN6_IS_ADDR_MULTICAST(a) \
f91671c7dc877a52adc06d0a7d0ed1c7f6391e6eMark Andrews ((a)->s6_addr8[0] == 0xffU)
f91671c7dc877a52adc06d0a7d0ed1c7f6391e6eMark Andrews
d9b4174233b951f25cd53a2787b9f14314258c2fMark Andrews/*
* Unicast link / site local.
*/
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif /* ISC_IPV6_H */