summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/winpcap/ip6_misc.h
blob: b25068801d19fe86d4f565658a3e2b715045b8df (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * Copyright (c) 1993, 1994, 1997
 *  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: (1) source code distributions
 * retain the above copyright notice and this paragraph in its entirety, (2)
 * distributions including binary code include the above copyright notice and
 * this paragraph in its entirety in the documentation or other materials
 * provided with the distribution, and (3) all advertising materials mentioning
 * features or use of this software display the following acknowledgement:
 * ``This product includes software developed by the University of California,
 * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 * @(#) $Header: /tcpdump/master/libpcap/Win32/Include/ip6_misc.h,v 1.5 2006-01-22 18:02:18 gianluca Exp $ (LBL)
 */

/*
 * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows
 */

#include <winsock2.h>

#include <ws2tcpip.h>

#ifndef __MINGW32__
#define IN_MULTICAST(a)     IN_CLASSD(a)
#endif

#define IN_EXPERIMENTAL(a)  ((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000)

#define IN_LOOPBACKNET      127

#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
/* IPv6 address */
struct in6_addr
	{
	union
		{
	u_int8_t        u6_addr8[16];
	u_int16_t   u6_addr16[8];
	u_int32_t   u6_addr32[4];
		} in6_u;
#define s6_addr         in6_u.u6_addr8
#define s6_addr16       in6_u.u6_addr16
#define s6_addr32       in6_u.u6_addr32
#define s6_addr64       in6_u.u6_addr64
	};

#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
#endif /* __MINGW32__ */


#if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF))
typedef unsigned short  sa_family_t;
#endif


#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)

#define __SOCKADDR_COMMON(sa_prefix) \
	sa_family_t sa_prefix##family

/* Ditto, for IPv6.  */
struct sockaddr_in6
	{
	__SOCKADDR_COMMON (sin6_);
	u_int16_t sin6_port;        /* Transport layer port # */
	u_int32_t sin6_flowinfo;    /* IPv6 flow information */
	struct in6_addr sin6_addr;  /* IPv6 address */
	};

#define IN6_IS_ADDR_V4MAPPED(a) \
	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
		(((u_int32_t *) (a))[2] == htonl (0xffff)))

#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff)

#define IN6_IS_ADDR_LINKLOCAL(a) \
	((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000))

#define IN6_IS_ADDR_LOOPBACK(a) \
	(((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \
		((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1))
#endif /* __MINGW32__ */

#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 nd_rd_type               nd_rd_hdr.icmp6_type
#define nd_rd_code               nd_rd_hdr.icmp6_code
#define nd_rd_cksum              nd_rd_hdr.icmp6_cksum
#define nd_rd_reserved           nd_rd_hdr.icmp6_data32[0]

/*
 *  IPV6 extension headers
 */
#define IPPROTO_HOPOPTS     0   /* IPv6 hop-by-hop options  */
#define IPPROTO_IPV6        41  /* IPv6 header.  */
#define IPPROTO_ROUTING     43  /* IPv6 routing header      */
#define IPPROTO_FRAGMENT    44  /* IPv6 fragmentation header    */
#define IPPROTO_ESP     50  /* encapsulating security payload */
#define IPPROTO_AH      51  /* authentication header    */
#define IPPROTO_ICMPV6      58  /* ICMPv6           */
#define IPPROTO_NONE        59  /* IPv6 no next header      */
#define IPPROTO_DSTOPTS     60  /* IPv6 destination options */
#define IPPROTO_PIM         103 /* Protocol Independent Multicast.  */

#define  IPV6_RTHDR_TYPE_0 0

/* Option types and related macros */
#define IP6OPT_PAD1     0x00    /* 00 0 00000 */
#define IP6OPT_PADN     0x01    /* 00 0 00001 */
#define IP6OPT_JUMBO        0xC2    /* 11 0 00010 = 194 */
#define IP6OPT_JUMBO_LEN    6
#define IP6OPT_ROUTER_ALERT 0x05    /* 00 0 00101 */

#define IP6OPT_RTALERT_LEN  4
#define IP6OPT_RTALERT_MLD  0   /* Datagram contains an MLD message */
#define IP6OPT_RTALERT_RSVP 1   /* Datagram contains an RSVP message */
#define IP6OPT_RTALERT_ACTNET   2   /* contains an Active Networks msg */
#define IP6OPT_MINLEN       2

#define IP6OPT_BINDING_UPDATE   0xc6    /* 11 0 00110 */
#define IP6OPT_BINDING_ACK  0x07    /* 00 0 00111 */
#define IP6OPT_BINDING_REQ  0x08    /* 00 0 01000 */
#define IP6OPT_HOME_ADDRESS 0xc9    /* 11 0 01001 */
#define IP6OPT_EID      0x8a    /* 10 0 01010 */

#define IP6OPT_TYPE(o)      ((o) & 0xC0)
#define IP6OPT_TYPE_SKIP    0x00
#define IP6OPT_TYPE_DISCARD 0x40
#define IP6OPT_TYPE_FORCEICMP   0x80
#define IP6OPT_TYPE_ICMP    0xC0

#define IP6OPT_MUTABLE      0x20


#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
#ifndef EAI_ADDRFAMILY
struct addrinfo {
	int ai_flags;   /* AI_PASSIVE, AI_CANONNAME */
	int ai_family;  /* PF_xxx */
	int ai_socktype;    /* SOCK_xxx */
	int ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
	size_t  ai_addrlen; /* length of ai_addr */
	char    *ai_canonname;  /* canonical name for hostname */
	struct sockaddr *ai_addr;   /* binary address */
	struct addrinfo *ai_next;   /* next structure in linked list */
};
#endif
#endif /* __MINGW32__ */