1 /**
2  * This file is part of the mingw-w64 runtime package.
3  * No warranty is given; refer to the file DISCLAIMER within this package.
4  */
5 #ifndef _WS2IPDEF_
6 #define _WS2IPDEF_
7 
8 #include <_mingw_unicode.h>
9 #include <winapifamily.h>
10 
11 #ifdef __LP64__
12 #pragma push_macro("u_long")
13 #undef u_long
14 #define u_long __ms_u_long
15 #endif
16 
17 #include <in6addr.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 typedef struct ipv6_mreq {
24   struct in6_addr ipv6mr_multiaddr;
25   unsigned int ipv6mr_interface;
26 } IPV6_MREQ;
27 
28 struct sockaddr_in6_old {
29   short sin6_family;
30   u_short sin6_port;
31   u_long sin6_flowinfo;
32   struct in6_addr sin6_addr;
33 };
34 
35 typedef union sockaddr_gen {
36   struct sockaddr Address;
37   struct sockaddr_in AddressIn;
38   struct sockaddr_in6_old AddressIn6;
39 } sockaddr_gen;
40 
41 struct sockaddr_in6 {
42   short sin6_family;
43   u_short sin6_port;
44   u_long sin6_flowinfo;
45   struct in6_addr sin6_addr;
46   __C89_NAMELESS union {
47     u_long sin6_scope_id;
48     SCOPE_ID sin6_scope_struct;
49   };
50 };
51 
52 typedef struct sockaddr_in6 SOCKADDR_IN6;
53 typedef struct sockaddr_in6 *PSOCKADDR_IN6;
54 typedef struct sockaddr_in6 *LPSOCKADDR_IN6;
55 
56 typedef struct _INTERFACE_INFO {
57   u_long iiFlags;
58   sockaddr_gen iiAddress;
59   sockaddr_gen iiBroadcastAddress;
60   sockaddr_gen iiNetmask;
61 } INTERFACE_INFO,*LPINTERFACE_INFO;
62 
63 typedef enum _MULTICAST_MODE_TYPE {
64   MCAST_INCLUDE   = 0,
65   MCAST_EXCLUDE
66 } MULTICAST_MODE_TYPE;
67 
68 typedef struct _sockaddr_in6_pair {
69   PSOCKADDR_IN6 SourceAddress;
70   PSOCKADDR_IN6 DestinationAddress;
71 } SOCKADDR_IN6_PAIR, *PSOCKADDR_IN6_PAIR;
72 
73 typedef union _SOCKADDR_INET {
74   SOCKADDR_IN    Ipv4;
75   SOCKADDR_IN6   Ipv6;
76   ADDRESS_FAMILY si_family;
77 } SOCKADDR_INET, *PSOCKADDR_INET;
78 
79 typedef struct group_filter {
80   ULONG               gf_interface;
81   SOCKADDR_STORAGE    gf_group;
82   MULTICAST_MODE_TYPE gf_fmode;
83   ULONG               gf_numsrc;
84   SOCKADDR_STORAGE    gf_slist[1];
85 } GROUP_FILTER, *PGROUP_FILTER;
86 
87 typedef struct group_req {
88   ULONG            gr_interface;
89   SOCKADDR_STORAGE gr_group;
90 } GROUP_REQ, *PGROUP_REQ;
91 
92 typedef struct group_source_req {
93   ULONG            gsr_interface;
94   SOCKADDR_STORAGE gsr_group;
95   SOCKADDR_STORAGE gsr_source;
96 } GROUP_SOURCE_REQ, *PGROUP_SOURCE_REQ;
97 
98 #define IPV6_HOPOPTS           1
99 #define IPV6_HDRINCL           2
100 #define IPV6_UNICAST_HOPS      4
101 #define IPV6_MULTICAST_IF      9
102 #define IPV6_MULTICAST_HOPS    10
103 #define IPV6_MULTICAST_LOOP    11
104 #define IPV6_ADD_MEMBERSHIP    12
105 #define IPV6_JOIN_GROUP        IPV6_ADD_MEMBERSHIP
106 #define IPV6_DROP_MEMBERSHIP   13
107 #define IPV6_LEAVE_GROUP       IPV6_DROP_MEMBERSHIP
108 #define IPV6_DONTFRAG          14
109 #define IPV6_PKTINFO           19
110 #define IPV6_HOPLIMIT          21
111 #define IPV6_PROTECTION_LEVEL  23
112 #define IPV6_RECVIF            24
113 #define IPV6_RECVDSTADDR       25
114 #define IPV6_CHECKSUM          26
115 #define IPV6_V6ONLY            27
116 #define IPV6_IFLIST            28
117 #define IPV6_ADD_IFLIST        29
118 #define IPV6_DEL_IFLIST        30
119 #define IPV6_UNICAST_IF        31
120 #define IPV6_RTHDR             32
121 #define IPV6_RECVRTHDR         38
122 #define IPV6_TCLASS            39
123 #define IPV6_RECVTCLASS        40
124 
125 #define WS2TCPIP_INLINE __CRT_INLINE
126 
127 int IN6_ADDR_EQUAL(const struct in6_addr *,const struct in6_addr *);
IN6_ADDR_EQUAL(const struct in6_addr * a,const struct in6_addr * b)128 WS2TCPIP_INLINE int IN6_ADDR_EQUAL(const struct in6_addr *a, const struct in6_addr *b) {
129     return !memcmp(a, b, sizeof(struct in6_addr));
130 }
131 
132 #define IN6_ARE_ADDR_EQUAL IN6_ADDR_EQUAL
133 
134 #ifdef __cplusplus
135 }
136 #endif
137 
138 #ifdef __LP64__
139 #pragma pop_macro("u_long")
140 #endif
141 
142 #endif /*_WS2IPDEF_ */
143