165 lines
6.1 KiB
C
165 lines
6.1 KiB
C
/* $FreeBSD$ */
|
|
/* $KAME: ip6.h,v 1.18 2001/03/29 05:34:30 itojun Exp $ */
|
|
|
|
/*-
|
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the project nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
/*-
|
|
* Copyright (c) 1982, 1986, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* @(#)ip.h 8.1 (Berkeley) 6/10/93
|
|
*/
|
|
|
|
#ifndef TCPLP_NETINET_IP6_H_
|
|
#define TCPLP_NETINET_IP6_H_
|
|
|
|
#include "types.h"
|
|
|
|
/* samkumar: Copied from netinet/in6.h */
|
|
struct in6_addr {
|
|
union {
|
|
uint8_t __u6_addr8[16];
|
|
uint16_t __u6_addr16[8];
|
|
uint32_t __u6_addr32[4];
|
|
} __u6_addr; /* 128-bit IP6 address */
|
|
} __attribute__((packed)); // added this to allow unaligned access
|
|
#define s6_addr __u6_addr.__u6_addr8
|
|
|
|
struct sockaddr_in6 {
|
|
uint8_t sin6_len; /* length of this struct */
|
|
int sin6_family; /* AF_INET6 */
|
|
uint16_t sin6_port; /* Transport layer port # */
|
|
uint32_t sin6_flowinfo; /* IP6 flow information */
|
|
struct in6_addr sin6_addr; /* IP6 address */
|
|
uint32_t sin6_scope_id; /* scope zone index */
|
|
};
|
|
|
|
/*
|
|
* Definition for internet protocol version 6.
|
|
* RFC 2460
|
|
*/
|
|
struct ip6_hdr {
|
|
union {
|
|
struct ip6_hdrctl {
|
|
u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */
|
|
u_int16_t ip6_un1_plen; /* payload length */
|
|
u_int8_t ip6_un1_nxt; /* next header */
|
|
u_int8_t ip6_un1_hlim; /* hop limit */
|
|
} ip6_un1;
|
|
u_int8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
|
|
} ip6_ctlun;
|
|
struct in6_addr ip6_src; /* source address */
|
|
struct in6_addr ip6_dst; /* destination address */
|
|
} __attribute__((packed));
|
|
|
|
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
|
|
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
|
|
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
|
|
#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
|
|
#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
|
|
#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
|
|
|
|
#define IPV6_VERSION 0x60
|
|
#define IPV6_VERSION_MASK 0xf0
|
|
|
|
/* samkumar: Removed #if guard since ECN is enabled in TCPlp. */
|
|
/* ECN bits proposed by Sally Floyd */
|
|
#define IP6TOS_CE 0x01 /* congestion experienced */
|
|
#define IP6TOS_ECT 0x02 /* ECN-capable transport */
|
|
|
|
// samkumar: Copied from in6.h
|
|
#define IN6_ARE_ADDR_EQUAL(a, b) \
|
|
(memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
|
|
|
|
/* Multicast */
|
|
#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
|
|
|
|
/*
|
|
* Unspecified
|
|
*/
|
|
#define IN6_IS_ADDR_UNSPECIFIED(a) \
|
|
((a)->__u6_addr.__u6_addr32[0] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[1] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[2] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[3] == 0)
|
|
|
|
/*
|
|
* Loopback
|
|
*/
|
|
#define IN6_IS_ADDR_LOOPBACK(a) \
|
|
((a)->__u6_addr.__u6_addr32[0] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[1] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[2] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[3] == ntohl(1))
|
|
|
|
/*
|
|
* Unicast Scope
|
|
* Note that we must check topmost 10 bits only, not 16 bits (see RFC2373).
|
|
*/
|
|
#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))
|
|
|
|
/*
|
|
* Mapped
|
|
*/
|
|
|
|
#define IN6_IS_ADDR_V4MAPPED(a) \
|
|
((a)->__u6_addr.__u6_addr32[0] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[1] == 0 && \
|
|
(a)->__u6_addr.__u6_addr32[2] == ntohl(0x0000ffff))
|
|
|
|
#endif /* not _NETINET_IP6_H_ */
|