11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _NETINET_IN6_H 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _NETINET_IN6_H 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/in6.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_UNSPECIFIED(a) \ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == 0)) 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_LOOPBACK(a) \ 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1))) 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_V4COMPAT(a) \ 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \ 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1))) 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_V4MAPPED(a) \ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_LINKLOCAL(a) \ 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_SITELOCAL(a) \ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6364b6c43379dba176659bc1313b6bb488ac94cfd6Steinar H. Gunderson/* RFC 4193. */ 6464b6c43379dba176659bc1313b6bb488ac94cfd6Steinar H. Gunderson#define IN6_IS_ADDR_ULA(a) \ 6564b6c43379dba176659bc1313b6bb488ac94cfd6Steinar H. Gunderson (((a)->s6_addr[0] & 0xfe) == 0xfc) 6664b6c43379dba176659bc1313b6bb488ac94cfd6Steinar H. Gunderson 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_MULTICAST(a) \ 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (((__const uint8_t *) (a))[0] == 0xff) 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_SCOPE_GLOBAL 0x0e 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IPV6_ADDR_MC_SCOPE(a) \ 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ((a)->s6_addr[1] & 0x0f) 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 81d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner#define IN6_IS_ADDR_MC_NODELOCAL(a) \ 82d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner (IN6_IS_ADDR_MULTICAST(a) && \ 83d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IN6_IS_ADDR_MULTICAST(a) && \ 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_MC_SITELOCAL(a) \ 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IN6_IS_ADDR_MULTICAST(a) && \ 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IN6_IS_ADDR_MULTICAST(a) && \ 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) 93d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner#define IN6_IS_ADDR_MC_GLOBAL(a) \ 94d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner (IN6_IS_ADDR_MULTICAST(a) && \ 95d4a65d28d4dd7dab4ad66d2d65903296d183d47cDavid 'Digit' Turner (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IN6_ARE_ADDR_EQUAL(a, b) \ 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define INET6_ADDRSTRLEN 46 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 102c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP 103c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP 104c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti 105c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IN6ADDR_ANY_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}} 1063de032169071cf6588edceefa686616cdf485320Steinar H. Gunderson#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}} 107c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti 108c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define ipv6mr_interface ipv6mr_ifindex 109c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti 110c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _NETINET_IN6_H */ 112