/*
* Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
* 2002, 2003, 2004
* Ohio University.
*
* ---
*
* Starting with the release of tcptrace version 6 in 2001, tcptrace
* is licensed under the GNU General Public License (GPL). We believe
* that, among the available licenses, the GPL will do the best job of
* allowing tcptrace to continue to be a valuable, freely-available
* and well-maintained tool for the networking community.
*
* Previous versions of tcptrace were released under a license that
* was much less restrictive with respect to how tcptrace could be
* used in commercial products. Because of this, I am willing to
* consider alternate license arrangements as allowed in Section 10 of
* the GNU GPL. Before I would consider licensing tcptrace under an
* alternate agreement with a particular individual or company,
* however, I would have to be convinced that such an alternative
* would be to the greater benefit of the networking community.
*
* ---
*
* This file is part of Tcptrace.
*
* Tcptrace was originally written and continues to be maintained by
* Shawn Ostermann with the help of a group of devoted students and
* users (see the file 'THANKS'). The work on tcptrace has been made
* possible over the years through the generous support of NASA GRC,
* the National Science Foundation, and Sun Microsystems.
*
* Tcptrace is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Tcptrace is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tcptrace (in the file 'COPYING'); if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Author: Shawn Ostermann
* School of Electrical Engineering and Computer Science
* Ohio University
* Athens, OH
* ostermann@cs.ohiou.edu
* http://www.tcptrace.org/
*/
static char const GCC_UNUSED rcsid_ipv6[] =
"@(#)$Header: /usr/local/cvs/tcptrace/ipv6.h,v 5.12 2003/11/19 14:38:07 sdo Exp $";
/*
* ipv6.h:
*
* Structures for IPv6 packets
*
*/
#include <sys/types.h>
#ifndef ETHERTYPE_IPV6
#define ETHERTYPE_IPV6 0x86DD /* Ethernet type for ipv6 */
#endif
/* just guessing... */
#if !defined(IPPROTO_NONE) && !defined(IPPROTO_FRAGMENT) && !defined(IPPROTO_DSTOPTS) && !defined(INET6_ADDRSTRLEN)
/* when IPv6 is more widely/standardly deployed, these constants won't need to be
here. In the mean time, here's the stuff we need... */
#define IPV6NOTFOUND
/* header types */
#define IPPROTO_HOPOPTS 0 /* Hop by hop header for v6 */
#define IPPROTO_IPV6 41 /* IPv6 encapsulated in IP */
#define IPPROTO_ROUTING 43 /* Routing header for IPv6 */
#define IPPROTO_FRAGMENT 44 /* Fragment header for IPv6 */
#define IPPROTO_ICMPV6 58 /* ICMP for IPv6 */
#define IPPROTO_NONE 59 /* No next header for IPv6 */
#define IPPROTO_DSTOPTS 60 /* Destinations options */
/* other constants we need */
#define INET6_ADDRSTRLEN 46 /* IPv6 Address length in a string format*/
/* this is SOMETIMES already defined */
#ifndef AF_INET6
#define AF_INET6 24 /* Internet Protocol, V6 */
#endif /* AF_INET6 */
/*
* IPv6 address data structure.
*/
#ifdef __WIN32
typedef struct in6_addr {
u_char s6_addr[16]; /* IPv6 address */
} in6_addr;
#endif /* __WIN32 */
#endif /* notdef IPPROTO_NONE */
/*
* IPv6 datagram header
*/
struct ipv6 {
u_int ip6_ver_tc_flabel; /* first 4 bits = version #,
next 8 bits = Trafic class,
next 20 bits = flow label */
u_short ip6_lngth; /* Payload length */
u_char ip6_nheader; /* Next Header */
u_char ip6_hlimit; /* Hop Limit */
struct in6_addr ip6_saddr; /* Source Address */
struct in6_addr ip6_daddr; /* Destination Address */
};
/* IPv6 extension header format */
struct ipv6_ext {
u_char ip6ext_nheader; /* Next Header */
u_char ip6ext_len; /* number of bytes in this header */
u_char ip6ext_data[2]; /* optional data */
};
/* IPv6 fragmentation header */
struct ipv6_ext_frag {
u_char ip6ext_fr_nheader; /* Next Header */
u_char ip6ext_fr_res; /* (reserved) */
u_short ip6ext_fr_offset; /* fragment offset(13),res(2),M(1) */
u_long ip6ext_fr_ID; /* ID field */
};
/* tcptrace's IPv6 access routines */
int gettcp(struct ip *pip, struct tcphdr **pptcp, void **pplast);
int getudp(struct ip *pip, struct udphdr **ppudp, void **pplast);
int getroutingheader(struct ip *pip, struct ipv6_ext **ppipv6_ext, void **pplast);
int gethdrlength (struct ip *pip, void *plast);
int getpayloadlength (struct ip *pip, void *plast);
struct ipv6_ext *ipv6_nextheader(void *pheader0, u_char *pnextheader);
char *ipv6_header_name(u_char nextheader);
char *my_inet_ntop(int af, const char *src, char *dst, size_t size);
int total_length_ext_headers(struct ipv6 *pip6);
syntax highlighted by Code2HTML, v. 0.9.1