1/* 2 * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 2000, 2001 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* $Id: ipv6.h,v 1.16 2007/06/19 23:47:23 tbox Exp $ */ 19 20#ifndef LWRES_IPV6_H 21#define LWRES_IPV6_H 1 22 23/***** 24 ***** Module Info 25 *****/ 26 27/*! \file lwres/ipv6.h 28 * IPv6 definitions for systems which do not support IPv6. 29 */ 30 31/*** 32 *** Imports. 33 ***/ 34 35#include <lwres/int.h> 36#include <lwres/platform.h> 37 38/*** 39 *** Types. 40 ***/ 41 42/*% in6_addr structure */ 43struct in6_addr { 44 union { 45 lwres_uint8_t _S6_u8[16]; 46 lwres_uint16_t _S6_u16[8]; 47 lwres_uint32_t _S6_u32[4]; 48 } _S6_un; 49}; 50/*@{*/ 51/*% IP v6 types */ 52#define s6_addr _S6_un._S6_u8 53#define s6_addr8 _S6_un._S6_u8 54#define s6_addr16 _S6_un._S6_u16 55#define s6_addr32 _S6_un._S6_u32 56/*@}*/ 57 58#define IN6ADDR_ANY_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}} 59#define IN6ADDR_LOOPBACK_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}} 60 61LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_any; 62LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback; 63 64/*% used in getaddrinfo.c and getnameinfo.c */ 65struct sockaddr_in6 { 66#ifdef LWRES_PLATFORM_HAVESALEN 67 lwres_uint8_t sin6_len; 68 lwres_uint8_t sin6_family; 69#else 70 lwres_uint16_t sin6_family; 71#endif 72 lwres_uint16_t sin6_port; 73 lwres_uint32_t sin6_flowinfo; 74 struct in6_addr sin6_addr; 75 lwres_uint32_t sin6_scope_id; 76}; 77 78#ifdef LWRES_PLATFORM_HAVESALEN 79#define SIN6_LEN 1 80#endif 81 82/*% in6_pktinfo structure */ 83struct in6_pktinfo { 84 struct in6_addr ipi6_addr; /*%< src/dst IPv6 address */ 85 unsigned int ipi6_ifindex; /*%< send/recv interface index */ 86}; 87 88/*! 89 * Unspecified IPv6 address 90 */ 91#define IN6_IS_ADDR_UNSPECIFIED(a) \ 92 (((a)->s6_addr32[0] == 0) && \ 93 ((a)->s6_addr32[1] == 0) && \ 94 ((a)->s6_addr32[2] == 0) && \ 95 ((a)->s6_addr32[3] == 0)) 96 97/* 98 * Loopback 99 */ 100#define IN6_IS_ADDR_LOOPBACK(a) \ 101 (((a)->s6_addr32[0] == 0) && \ 102 ((a)->s6_addr32[1] == 0) && \ 103 ((a)->s6_addr32[2] == 0) && \ 104 ((a)->s6_addr32[3] == htonl(1))) 105 106/* 107 * IPv4 compatible 108 */ 109#define IN6_IS_ADDR_V4COMPAT(a) \ 110 (((a)->s6_addr32[0] == 0) && \ 111 ((a)->s6_addr32[1] == 0) && \ 112 ((a)->s6_addr32[2] == 0) && \ 113 ((a)->s6_addr32[3] != 0) && \ 114 ((a)->s6_addr32[3] != htonl(1))) 115 116/* 117 * Mapped 118 */ 119#define IN6_IS_ADDR_V4MAPPED(a) \ 120 (((a)->s6_addr32[0] == 0) && \ 121 ((a)->s6_addr32[1] == 0) && \ 122 ((a)->s6_addr32[2] == htonl(0x0000ffff))) 123 124#endif /* LWRES_IPV6_H */ 125