172 lines
5.3 KiB
C
172 lines
5.3 KiB
C
/*
|
|
** WS2TCPIP.H - WinSock2 Extension for TCP/IP protocols
|
|
**
|
|
** This file contains TCP/IP specific information for use
|
|
** by WinSock2 compatible applications.
|
|
**
|
|
** Copyright (c) 1995-1999 Microsoft Corporation
|
|
**
|
|
** To provide the backward compatibility, all the TCP/IP
|
|
** specific definitions that were included in the WINSOCK.H
|
|
** file are now included in WINSOCK2.H file. WS2TCPIP.H
|
|
** file includes only the definitions introduced in the
|
|
** "WinSock 2 Protocol-Specific Annex" document.
|
|
**
|
|
** Rev 0.3 Nov 13, 1995
|
|
** Rev 0.4 Dec 15, 1996
|
|
*/
|
|
|
|
#ifndef _WS2TCPIP_H_
|
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
|
#define _WS2TCPIP_H_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
/* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP */
|
|
|
|
struct ip_mreq {
|
|
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
|
struct in_addr imr_interface; /* local IP address of interface */
|
|
};
|
|
|
|
/* TCP/IP specific Ioctl codes */
|
|
|
|
#define SIO_GET_INTERFACE_LIST _IOR('t', 127, u_long)
|
|
/* New IOCTL with address size independent address array */
|
|
#define SIO_GET_INTERFACE_LIST_EX _IOR('t', 126, u_long)
|
|
|
|
/* Option to use with [gs]etsockopt at the IPPROTO_IP level */
|
|
|
|
#define IP_OPTIONS 1 /* set/get IP options */
|
|
#define IP_HDRINCL 2 /* header is included with data */
|
|
#define IP_TOS 3 /* IP type of service and preced*/
|
|
#define IP_TTL 4 /* IP time to live */
|
|
#define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */
|
|
#define IP_MULTICAST_TTL 10 /* set/get IP multicast ttl */
|
|
#define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */
|
|
#define IP_ADD_MEMBERSHIP 12 /* add an IP group membership */
|
|
#define IP_DROP_MEMBERSHIP 13/* drop an IP group membership */
|
|
#define IP_DONTFRAGMENT 14 /* don't fragment IP datagrams */
|
|
|
|
|
|
/* Option to use with [gs]etsockopt at the IPPROTO_UDP level */
|
|
|
|
#define UDP_NOCHECKSUM 1
|
|
|
|
/* Option to use with [gs]etsockopt at the IPPROTO_TCP level */
|
|
|
|
#define TCP_EXPEDITED_1122 0x0002
|
|
|
|
|
|
/* IPv6 definitions */
|
|
|
|
struct in_addr6 {
|
|
u_char s6_addr[16]; /* IPv6 address */
|
|
};
|
|
|
|
/* Old IPv6 socket address structure (retained for sockaddr_gen definition below) */
|
|
|
|
struct sockaddr_in6_old {
|
|
short sin6_family; /* AF_INET6 */
|
|
u_short sin6_port; /* Transport level port number */
|
|
u_long sin6_flowinfo; /* IPv6 flow information */
|
|
struct in_addr6 sin6_addr; /* IPv6 address */
|
|
};
|
|
|
|
/* IPv6 socket address structure, RFC 2553 */
|
|
|
|
struct sockaddr_in6 {
|
|
short sin6_family; /* AF_INET6 */
|
|
u_short sin6_port; /* Transport level port number */
|
|
u_long sin6_flowinfo; /* IPv6 flow information */
|
|
struct in_addr6 sin6_addr; /* IPv6 address */
|
|
u_long sin6_scope_id; /* set of interfaces for a scope */
|
|
};
|
|
|
|
|
|
typedef struct in_addr6 IN6_ADDR;
|
|
typedef struct in_addr6 *PIN6_ADDR;
|
|
typedef struct in_addr6 FAR *LPIN6_ADDR;
|
|
|
|
typedef struct sockaddr_in6 SOCKADDR_IN6;
|
|
typedef struct sockaddr_in6 *PSOCKADDR_IN6;
|
|
typedef struct sockaddr_in6 FAR *LPSOCKADDR_IN6;
|
|
|
|
|
|
#define IN6ADDR_SETANY(x) {\
|
|
(x)->sin6_family = AF_INET6; \
|
|
(x)->sin6_port = 0; \
|
|
(x)->sin6_flowinfo = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) ) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 3) = 0; \
|
|
}
|
|
#define IN6ADDR_SETLOOPBACK(x) {\
|
|
(x)->sin6_family = AF_INET6; \
|
|
(x)->sin6_port = 0; \
|
|
(x)->sin6_flowinfo = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) ) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 3) = 1; \
|
|
}
|
|
|
|
#define IN6ADDR_ISANY(x) ( \
|
|
(x)->sin6_family == AF_INET6 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) ) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 1) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 2) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 3) == 0 \
|
|
)
|
|
|
|
|
|
#define IN6ADDR_ISLOOPBACK(x) (\
|
|
(x)->sin6_family == AF_INET6 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) ) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 1) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 2) == 0 && \
|
|
*((u_long *)((x)->sin6_addr.s6_addr) + 3) == 1 \
|
|
)
|
|
|
|
|
|
typedef union sockaddr_gen{
|
|
struct sockaddr Address;
|
|
struct sockaddr_in AddressIn;
|
|
struct sockaddr_in6_old AddressIn6;
|
|
} sockaddr_gen;
|
|
|
|
/* Structure to keep interface specific information */
|
|
|
|
typedef struct _INTERFACE_INFO
|
|
{
|
|
u_long iiFlags; /* Interface flags */
|
|
sockaddr_gen iiAddress; /* Interface address */
|
|
sockaddr_gen iiBroadcastAddress; /* Broadcast address */
|
|
sockaddr_gen iiNetmask; /* Network mask */
|
|
} INTERFACE_INFO, FAR * LPINTERFACE_INFO;
|
|
|
|
/* New structure that does not have dependency on the address size */
|
|
typedef struct _INTERFACE_INFO_EX
|
|
{
|
|
u_long iiFlags; /* Interface flags */
|
|
SOCKET_ADDRESS iiAddress; /* Interface address */
|
|
SOCKET_ADDRESS iiBroadcastAddress; /* Broadcast address */
|
|
SOCKET_ADDRESS iiNetmask; /* Network mask */
|
|
} INTERFACE_INFO_EX, FAR * LPINTERFACE_INFO_EX;
|
|
|
|
/* Possible flags for the iiFlags - bitmask */
|
|
|
|
#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 */
|
|
|
|
|
|
#pragma option pop /*P_O_Pop*/
|
|
#endif /* _WS2TCPIP_H_ */
|
|
|