ws2ipdef.h 10.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Copyright (C) 2009 Robert Shearman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef __WS2IPDEF__
#define __WS2IPDEF__

22
#include <in6addr.h>
23 24 25 26 27 28 29 30 31

#ifdef USE_WS_PREFIX
#define WS(x)    WS_##x
#else
#define WS(x)    x
#endif

typedef struct WS(sockaddr_in6_old)
{
32 33 34 35
   SHORT    sin6_family;
   USHORT   sin6_port;
   ULONG    sin6_flowinfo;
   IN6_ADDR sin6_addr;
36 37 38 39 40 41 42 43 44 45 46 47
} SOCKADDR_IN6_OLD,*PSOCKADDR_IN6_OLD, *LPSOCKADDR_IN6_OLD;

typedef union sockaddr_gen
{
   struct WS(sockaddr) Address;
   struct WS(sockaddr_in)  AddressIn;
   struct WS(sockaddr_in6_old) AddressIn6;
} WS(sockaddr_gen);

/* Structure to keep interface specific information */
typedef struct _INTERFACE_INFO
{
48
    ULONG             iiFlags;             /* Interface flags */
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
    WS(sockaddr_gen)  iiAddress;           /* Interface address */
    WS(sockaddr_gen)  iiBroadcastAddress;  /* Broadcast address */
    WS(sockaddr_gen)  iiNetmask;           /* Network mask */
} INTERFACE_INFO, * LPINTERFACE_INFO;

/* Possible flags for the  iiFlags - bitmask  */
#ifndef USE_WS_PREFIX
#define IFF_UP                0x00000001 /* Interface is up */
#define IFF_BROADCAST         0x00000002 /* Broadcast is  supported */
#define IFF_LOOPBACK          0x00000004 /* this is loopback interface */
#define IFF_POINTTOPOINT      0x00000008 /* this is point-to-point interface */
#define IFF_MULTICAST         0x00000010 /* multicast is supported */
#else
#define WS_IFF_UP             0x00000001 /* Interface is up */
#define WS_IFF_BROADCAST      0x00000002 /* Broadcast is  supported */
#define WS_IFF_LOOPBACK       0x00000004 /* this is loopback interface */
#define WS_IFF_POINTTOPOINT   0x00000008 /* this is point-to-point interface */
#define WS_IFF_MULTICAST      0x00000010 /* multicast is supported */
#endif /* USE_WS_PREFIX */

#ifndef USE_WS_PREFIX
#define IP_OPTIONS                      1
#define IP_HDRINCL                      2
#define IP_TOS                          3
#define IP_TTL                          4
#define IP_MULTICAST_IF                 9
#define IP_MULTICAST_TTL                10
#define IP_MULTICAST_LOOP               11
#define IP_ADD_MEMBERSHIP               12
#define IP_DROP_MEMBERSHIP              13
#define IP_DONTFRAGMENT                 14
#define IP_ADD_SOURCE_MEMBERSHIP        15
#define IP_DROP_SOURCE_MEMBERSHIP       16
#define IP_BLOCK_SOURCE                 17
#define IP_UNBLOCK_SOURCE               18
#define IP_PKTINFO                      19
85
#define IP_HOPLIMIT                     21
86
#define IP_RECEIVE_BROADCAST            22
87 88 89 90 91 92 93 94
#define IP_RECVIF                       24
#define IP_RECVDSTADDR                  25
#define IP_IFLIST                       28
#define IP_ADD_IFLIST                   29
#define IP_DEL_IFLIST                   30
#define IP_UNICAST_IF                   31
#define IP_RTHDR                        32
#define IP_RECVRTHDR                    38
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
#else
#define WS_IP_OPTIONS                   1
#define WS_IP_HDRINCL                   2
#define WS_IP_TOS                       3
#define WS_IP_TTL                       4
#define WS_IP_MULTICAST_IF              9
#define WS_IP_MULTICAST_TTL             10
#define WS_IP_MULTICAST_LOOP            11
#define WS_IP_ADD_MEMBERSHIP            12
#define WS_IP_DROP_MEMBERSHIP           13
#define WS_IP_DONTFRAGMENT              14
#define WS_IP_ADD_SOURCE_MEMBERSHIP     15
#define WS_IP_DROP_SOURCE_MEMBERSHIP    16
#define WS_IP_BLOCK_SOURCE              17
#define WS_IP_UNBLOCK_SOURCE            18
#define WS_IP_PKTINFO                   19
111
#define WS_IP_HOPLIMIT                  21
112
#define WS_IP_RECEIVE_BROADCAST         22
113 114 115 116 117 118 119 120
#define WS_IP_RECVIF                    24
#define WS_IP_RECVDSTADDR               25
#define WS_IP_IFLIST                    28
#define WS_IP_ADD_IFLIST                29
#define WS_IP_DEL_IFLIST                30
#define WS_IP_UNICAST_IF                31
#define WS_IP_RTHDR                     32
#define WS_IP_RECVRTHDR                 38
121 122 123 124
#endif /* USE_WS_PREFIX */

typedef struct WS(sockaddr_in6)
{
125 126 127 128 129
   SHORT    sin6_family;
   USHORT   sin6_port;
   ULONG    sin6_flowinfo;
   IN6_ADDR sin6_addr;
   ULONG    sin6_scope_id;
130 131
} SOCKADDR_IN6,*PSOCKADDR_IN6, *LPSOCKADDR_IN6;

132 133 134 135 136 137
typedef struct WS(sockaddr_in6_pair)
{
    PSOCKADDR_IN6 SourceAddress;
    PSOCKADDR_IN6 DestinationAddress;
} SOCKADDR_IN6_PAIR, *PSOCKADDR_IN6_PAIR;

138 139 140 141 142 143 144
typedef union _SOCKADDR_INET
{
    SOCKADDR_IN     Ipv4;
    SOCKADDR_IN6    Ipv6;
    ADDRESS_FAMILY  si_family;
} SOCKADDR_INET, *PSOCKADDR_INET;

145 146 147 148
/*
 * Multicast group information
 */

149
typedef struct WS(ip_mreq)
150 151 152 153 154
{
    struct WS(in_addr) imr_multiaddr;
    struct WS(in_addr) imr_interface;
} WS(IP_MREQ), *WS(PIP_MREQ);

155
typedef struct WS(ip_mreq_source) {
156 157 158 159 160
    struct WS(in_addr) imr_multiaddr;
    struct WS(in_addr) imr_sourceaddr;
    struct WS(in_addr) imr_interface;
} WS(IP_MREQ_SOURCE), *WS(PIP_MREQ_SOURCE);

161
typedef struct WS(ip_msfilter) {
162 163
    struct WS(in_addr) imsf_multiaddr;
    struct WS(in_addr) imsf_interface;
164 165
    ULONG              imsf_fmode;
    ULONG              imsf_numsrc;
166 167 168
    struct WS(in_addr) imsf_slist[1];
} WS(IP_MSFILTER), *WS(PIP_MSFILTER);

169 170 171 172 173
typedef struct WS(in_pktinfo) {
    IN_ADDR ipi_addr;
    UINT    ipi_ifindex;
} IN_PKTINFO, *PIN_PKTINFO;

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
#ifndef USE_WS_PREFIX
#define IPV6_OPTIONS                    1
#define IPV6_HDRINCL                    2
#define IPV6_UNICAST_HOPS               4
#define IPV6_MULTICAST_IF               9
#define IPV6_MULTICAST_HOPS             10
#define IPV6_MULTICAST_LOOP             11
#define IPV6_ADD_MEMBERSHIP             12
#define IPV6_JOIN_GROUP                 IPV6_ADD_MEMBERSHIP
#define IPV6_DROP_MEMBERSHIP            13
#define IPV6_LEAVE_GROUP                IPV6_DROP_MEMBERSHIP
#define IPV6_DONTFRAG                   14
#define IPV6_PKTINFO                    19
#define IPV6_HOPLIMIT                   21
#define IPV6_PROTECTION_LEVEL           23
#define IPV6_RECVIF                     24
#define IPV6_RECVDSTADDR                25
#define IPV6_CHECKSUM                   26
#define IPV6_V6ONLY                     27
#define IPV6_IFLIST                     28
#define IPV6_ADD_IFLIST                 29
#define IPV6_DEL_IFLIST                 30
#define IPV6_UNICAST_IF                 31
#define IPV6_RTHDR                      32
#define IPV6_RECVRTHDR                  38
#else
#define WS_IPV6_OPTIONS                 1
#define WS_IPV6_HDRINCL                 2
#define WS_IPV6_UNICAST_HOPS            4
#define WS_IPV6_MULTICAST_IF            9
#define WS_IPV6_MULTICAST_HOPS          10
#define WS_IPV6_MULTICAST_LOOP          11
#define WS_IPV6_ADD_MEMBERSHIP          12
#define WS_IPV6_DROP_MEMBERSHIP         13
#define WS_IPV6_LEAVE_GROUP             WS_IPV6_DROP_MEMBERSHIP
#define WS_IPV6_DONTFRAG                14
#define WS_IPV6_PKTINFO                 19
#define WS_IPV6_HOPLIMIT                21
#define WS_IPV6_PROTECTION_LEVEL        23
#define WS_IPV6_RECVIF                  24
#define WS_IPV6_RECVDSTADDR             25
#define WS_IPV6_CHECKSUM                26
#define WS_IPV6_V6ONLY                  27
#define WS_IPV6_IFLIST                  28
#define WS_IPV6_ADD_IFLIST              29
#define WS_IPV6_DEL_IFLIST              30
#define WS_IPV6_UNICAST_IF              31
#define WS_IPV6_RTHDR                   32
#define WS_IPV6_RECVRTHDR               38
#endif /* USE_WS_PREFIX */

#ifndef USE_WS_PREFIX
#define TCP_OFFLOAD_NO_PREFERENCE       0
#define TCP_OFFLOAD_NOT_PREFERRED       1
#define TCP_OFFLOAD_PREFERRED           2
#else
#define WS_TCP_OFFLOAD_NO_PREFERENCE    0
#define WS_TCP_OFFLOAD_NOT_PREFERRED    1
#define WS_TCP_OFFLOAD_PREFERRED        2
#endif /* USE_WS_PREFIX */

#ifndef USE_WS_PREFIX
/* TCP_NODELAY is defined elsewhere */
#define TCP_EXPEDITED_1122              2
#define TCP_KEEPALIVE                   3
#define TCP_MAXSEG                      4
#define TCP_MAXRT                       5
#define TCP_STDURG                      6
#define TCP_NOURG                       7
#define TCP_ATMARK                      8
#define TCP_NOSYNRETRIES                9
#define TCP_TIMESTAMPS                  10
#define TCP_OFFLOAD_PREFERENCE          11
#define TCP_CONGESTION_ALGORITHM        12
#define TCP_DELAY_FIN_ACK               13
#else
/* WS_TCP_NODELAY is defined elsewhere */
#define WS_TCP_EXPEDITED_1122           2
#define WS_TCP_KEEPALIVE                3
#define WS_TCP_MAXSEG                   4
#define WS_TCP_MAXRT                    5
#define WS_TCP_STDURG                   6
#define WS_TCP_NOURG                    7
#define WS_TCP_ATMARK                   8
#define WS_TCP_NOSYNRETRIES             9
#define WS_TCP_TIMESTAMPS               10
#define WS_TCP_OFFLOAD_PREFERENCE       11
#define WS_TCP_CONGESTION_ALGORITHM     12
#define WS_TCP_DELAY_FIN_ACK            13
#endif /* USE_WS_PREFIX */

#ifndef USE_WS_PREFIX
#define INET_ADDRSTRLEN         22
#define INET6_ADDRSTRLEN        65
268 269
#define IN6ADDR_ANY_INIT        { 0 }
#define IN6ADDR_LOOPBACK_INIT   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
270 271 272
#else
#define WS_INET_ADDRSTRLEN      22
#define WS_INET6_ADDRSTRLEN     65
273 274
#define WS_IN6ADDR_ANY_INIT     { 0 }
#define WS_IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
275 276
#endif /* USE_WS_PREFIX */

277 278 279 280
#ifdef __cplusplus
extern "C" {
#endif

281 282 283 284 285 286 287 288 289 290 291 292
static inline BOOL WS(IN6_IS_ADDR_LOOPBACK) ( const IN6_ADDR *a )
{
    return (BOOL)((a->s6_words[0] == 0) &&
                  (a->s6_words[1] == 0) &&
                  (a->s6_words[2] == 0) &&
                  (a->s6_words[3] == 0) &&
                  (a->s6_words[4] == 0) &&
                  (a->s6_words[5] == 0) &&
                  (a->s6_words[6] == 0) &&
                  (a->s6_words[7] == 0x0100));
}

293 294 295 296
#ifdef __cplusplus
}
#endif

297
#endif /* __WS2IPDEF__ */