aboutsummaryrefslogtreecommitdiff
path: root/winsup/w32api/include/ws2tcpip.h
blob: 3add12a65a688cf7b72b43d44f2d7cf9c6cfb312 (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
/*
 *  ws2tcpip.h : TCP/IP specific extensions in Windows Sockets 2
 *
 * Portions Copyright (c) 1980, 1983, 1988, 1993
 * The Regents of the University of California.  All rights reserved.
 *
 */

#ifndef _WS2TCPIP_H
#define _WS2TCPIP_H

#include <winsock2.h>

/* 
 * The IP_* macros are also defined in winsock.h, but some values are different there.
 * The values defined in winsock.h for 1.1 and used in wsock32.dll are consistent
 * with the original values Steve Deering defined in his document "IP Multicast Extensions
 * for 4.3BSD UNIX related systems (MULTICAST 1.2 Release)." However, these conflicted with
 * the definitions for some IPPROTO_IP level socket options already assigned by BSD,
 * so Berkeley changed all the values by adding 7.  WinSock2 (ws2_32.dll)  uses
 * the BSD 4.4 compatible values defined here.
 *
 * See also: msdn kb article Q257460
 * http://support.microsoft.com/support/kb/articles/Q257/4/60.asp
 */

/* This is also defined in winsock.h; value hasn't changed */
#define	IP_OPTIONS  1

#define	IP_HDRINCL  2
/*
 * These are also be defined in winsock.h,
 * but values have changed for WinSock2 interface
 */
#define	IP_TOS  3   /* old (winsock 1.1) value 8 */
#define	IP_TTL  4  /* old value 7 */
#define	IP_MULTICAST_IF 	9 /* old value 2 */
#define	IP_MULTICAST_TTL    10 /* old value 3 */
#define	IP_MULTICAST_LOOP   11 /* old value 4 */
#define	IP_ADD_MEMBERSHIP   12 /* old value 5 */
#define	IP_DROP_MEMBERSHIP  13 /* old value 6 */
#define IP_DONTFRAGMENT 14 /* old value 9 */

#define IP_DEFAULT_MULTICAST_TTL 1 
#define IP_DEFAULT_MULTICAST_LOOP 1 
#define IP_MAX_MEMBERSHIPS 20 

#define TCP_EXPEDITED_1122  2

#define UDP_NOCHECKSUM	1

#define IFF_UP  1
#define IFF_BROADCAST   2
#define IFF_LOOPBACK    4
#define IFF_POINTTOPOINT    8
#define IFF_MULTICAST   16

#define SIO_GET_INTERFACE_LIST  _IOR('t', 127, u_long)	

/*
 *   ip_mreq also in winsock.h for WinSock1.1,
 *   but online msdn docs say it is defined here for WinSock2.
 */ 
struct ip_mreq {
	struct in_addr imr_multiaddr;
	struct in_addr imr_interface;
};

typedef struct _INTERFACE_INFO {
	u_long		iiFlags;
    struct sockaddr iiAddress;
	struct sockaddr iiBroadcastAddress;
	struct sockaddr iiNetmask;
} INTERFACE_INFO, *LPINTERFACE_INFO;


/* ipv6 */ 

/*
 * According to online msdn documentation (12 Dec 2000), two separate implentations
 * of ipv6 are available (1) the Microsoft IPv6 Technology Preview  (requires W2K SP1)
 * and (2) the MS Research IPV6 implementation (requires NT4 or W2K).
 * Neither are production level implementations.    
 */

#if 0
/*
 * The following is based on what online msdn PSDK docs say as at 5 Dec 2000
 */
struct in_addr6 /* sic */ { u_char s6_addr[16]; };
typedef struct in_addr6 IN6_ADDR,  *PIN6_ADDR, *LPIN6_ADDR;

typedef struct sockaddr_in6 {
		short	sin6_family;
		u_short sin6_port;
		u_long	sin6_flowinfo;
		struct in_addr6 sin6_addr;
} SOCKADDR_IN6, *PSOCKADDR_IN6, *LPSOCKADDR_IN6;

#elif 0
/*
 * In the FAQ section of Microsoft IPv6 Technology Preview for Windows 2000
 * (dated 12 Dec 2000) it says that the Preview and the MS Research implemntation
 * support RFC 2553, and in particular, uses the sockaddr_in6 structure defined
 * in Section 3.3. That would look something like this:
*/
#include <stdint.h>
struct in6_addr { /* this is the standard name */
        union {
                uint8_t   _u6_addr8[16];
                uint16_t  _u6_addr16[8];
                uint32_t  _u6_addr32[4];
             /* uint64_t  _u6_addr64[2];*/ 
        } _u6_addr;
};
typedef struct in6_addr IN6_ADDR,  *PIN6_ADDR, *LPIN6_ADDR;
#define s6_addr   _u6_addr._u6_addr8

struct sockaddr_in6 {
    uint16_t sin6_family; /* AF_INET6 */
	uint16_t sin6_port; /* transport layer port # */
	uint32_t sin6_flowinfo; /* IPv6 traffic class & flow info */
	struct in6_addr sin6_addr;  /* IPv6 address */
    uint32_t sin6_scope_id;  /* set of interfaces for a scope */
};
typedef struct sockaddr_in6  SOCKADDR_IN6, *PSOCKADDR_IN6, *LPSOCKADDR_IN6;

/*
 * Watch this space.
 * These may get moved out to ipv6 specific header(s). along with other
 * standard structures and functions specified in RFC 2553.    
 */
#endif

#endif	/* _WS2TCPIP_H */