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 */
287dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _NETINET_IN6_H
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _NETINET_IN6_H
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
325470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#include <sys/cdefs.h>
335470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/in6.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
367dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_UNSPECIFIED(a) \
375470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes  ((((a)->s6_addr32[0]) == 0) && \
385470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[1]) == 0) && \
395470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[2]) == 0) && \
405470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[3]) == 0))
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
427dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_LOOPBACK(a) \
435470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes  ((((a)->s6_addr32[0]) == 0) && \
445470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[1]) == 0) && \
455470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[2]) == 0) && \
465470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[3]) == ntohl(1)))
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
487dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_V4COMPAT(a) \
495470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes  ((((a)->s6_addr32[0]) == 0) && \
505470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[1]) == 0) && \
515470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[2]) == 0) && \
525470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[3]) != 0) && (((a)->s6_addr32[3]) != ntohl(1)))
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
547dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_V4MAPPED(a) \
555470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes  ((((a)->s6_addr32[0]) == 0) && \
565470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[1]) == 0) && \
575470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes   (((a)->s6_addr32[2]) == ntohl(0x0000ffff)))
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
595470c183611737af5ec954984e4bdb5da8c99b73Elliott Hughes#define __bionic_s6_addr(a) __BIONIC_CAST(reinterpret_cast, const uint8_t*, a)
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
617dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_LINKLOCAL(a) \
627dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  ((__bionic_s6_addr(a)[0] == 0xfe) && ((__bionic_s6_addr(a)[1] & 0xc0) == 0x80))
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
647dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_SITELOCAL(a) \
657dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  ((__bionic_s6_addr(a)[0] == 0xfe) && ((__bionic_s6_addr(a)[1] & 0xc0) == 0xc0))
6664b6c43379dba176659bc1313b6bb488ac94cfd6Steinar H. Gunderson
677dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MULTICAST(a) (__bionic_s6_addr(a)[0] == 0xff)
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
697dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_ULA(a) ((__bionic_s6_addr(a)[0] & 0xfe) == 0xfc)
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
787dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IPV6_ADDR_MC_SCOPE(a) (__bionic_s6_addr(a)[1] & 0x0f)
797dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes
807dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MC_NODELOCAL(a) \
817dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
827dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
837dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
847dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MC_SITELOCAL(a) \
857dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
867dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
877dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
887dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_IS_ADDR_MC_GLOBAL(a) \
897dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
907dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes
917dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes#define IN6_ARE_ADDR_EQUAL(a, b) \
927dac8b8aabadbf2dcff20d3646e701728ba3777dElliott Hughes  (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define INET6_ADDRSTRLEN 46
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
96c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
97c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP
98c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti
99c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define IN6ADDR_ANY_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}
1003de032169071cf6588edceefa686616cdf485320Steinar H. Gunderson#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}
101c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti
102c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti#define ipv6mr_interface ipv6mr_ifindex
103c52c174e412fa6c829cf6353ce8dbebdf710511fLorenzo Colitti
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _NETINET_IN6_H */
105