summaryrefslogtreecommitdiff
path: root/FreeRTOS-Plus/Demo/FreeRTOS_Cellular_Interface_Windows_Simulator/Common/WinPCap/ip6_misc.h
blob: 1b2e4337b55d623f3b063ba0b62e1df2207b04d6 (plain)
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
164
165
/*
 * 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 /* ifndef EAI_ADDRFAMILY */
#endif /* __MINGW32__ */