353 lines
17 KiB
C
353 lines
17 KiB
C
|
/*++
|
||
|
|
||
|
Copyright(c) 1998,99 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
wlbsiocl.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Windows Load Balancing Service (WLBS)
|
||
|
IOCTL and remote control specifications
|
||
|
|
||
|
Author:
|
||
|
|
||
|
kyrilf
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _Wlbsiocl_h_
|
||
|
#define _Wlbsiocl_h_
|
||
|
|
||
|
#ifdef KERNEL_MODE
|
||
|
|
||
|
#include <ndis.h>
|
||
|
#include <ntddndis.h>
|
||
|
#include <devioctl.h>
|
||
|
typedef BOOLEAN BOOL;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <winioctl.h>
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#include "wlbsparm.h"
|
||
|
|
||
|
/* these are not strictly parameters, but this is a good place to put them, since this file is shared among user and kernel modes */
|
||
|
|
||
|
/* Microsoft says that this value should be in the range 32768-65536 */
|
||
|
#define CVY_DEVICE_TYPE 0xc0c0
|
||
|
|
||
|
#define IOCTL_CVY_CLUSTER_ON CTL_CODE(CVY_DEVICE_TYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_CLUSTER_OFF CTL_CODE(CVY_DEVICE_TYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_PORT_ON CTL_CODE(CVY_DEVICE_TYPE, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_PORT_OFF CTL_CODE(CVY_DEVICE_TYPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_QUERY CTL_CODE(CVY_DEVICE_TYPE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_RELOAD CTL_CODE(CVY_DEVICE_TYPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_PORT_SET CTL_CODE(CVY_DEVICE_TYPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_PORT_DRAIN CTL_CODE(CVY_DEVICE_TYPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_CLUSTER_DRAIN CTL_CODE(CVY_DEVICE_TYPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_CLUSTER_PLUG CTL_CODE(CVY_DEVICE_TYPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) /* Internal only - passed from main.c to load.c when a start interrupts a drain. */
|
||
|
#define IOCTL_CVY_CLUSTER_SUSPEND CTL_CODE(CVY_DEVICE_TYPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_CLUSTER_RESUME CTL_CODE(CVY_DEVICE_TYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#define IOCTL_CVY_QUERY_STATE CTL_CODE(CVY_DEVICE_TYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#if defined (NLB_SESSION_SUPPORT)
|
||
|
#define IOCTL_CVY_CONNECTION_NOTIFY CTL_CODE(CVY_DEVICE_TYPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#endif
|
||
|
#if defined (SBH)
|
||
|
#define IOCTL_CVY_QUERY_PERF CTL_CODE(CVY_DEVICE_TYPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
#endif
|
||
|
|
||
|
#define IOCTL_CVY_OK 0
|
||
|
#define IOCTL_CVY_ALREADY 1
|
||
|
#define IOCTL_CVY_BAD_PARAMS 2
|
||
|
#define IOCTL_CVY_NOT_FOUND 3
|
||
|
#define IOCTL_CVY_STOPPED 4
|
||
|
#define IOCTL_CVY_CONVERGING 5
|
||
|
#define IOCTL_CVY_SLAVE 6
|
||
|
#define IOCTL_CVY_MASTER 7
|
||
|
#define IOCTL_CVY_BAD_PASSWORD 8
|
||
|
#define IOCTL_CVY_DRAINING 9
|
||
|
#define IOCTL_CVY_DRAINING_STOPPED 10
|
||
|
#define IOCTL_CVY_SUSPENDED 11
|
||
|
#define IOCTL_CVY_DISCONNECTED 12
|
||
|
|
||
|
#define IOCTL_REMOTE_CODE 0xb055c0de
|
||
|
#define IOCTL_REMOTE_VR_PASSWORD L"b055c0de"
|
||
|
#define IOCTL_REMOTE_VR_CODE 0x9CD8906E
|
||
|
#define IOCTL_REMOTE_SEND_RETRIES 5
|
||
|
#define IOCTL_REMOTE_RECV_DELAY 100
|
||
|
#define IOCTL_REMOTE_RECV_RETRIES 20
|
||
|
|
||
|
#define IOCTL_MASTER_HOST 0 /* MASTER_HOST host id */
|
||
|
#define IOCTL_ALL_HOSTS 0xffffffff /* ALL_HOSTS host id */
|
||
|
#define IOCTL_ALL_PORTS 0xffffffff /* Apply to all port rules. */
|
||
|
#define IOCTL_ALL_VIPS 0x00000000 /* For virtual clusters, this is the ALL VIP specification for disable/enable/drain
|
||
|
(including both specific VIP and "ALL VIP" port rules). */
|
||
|
|
||
|
#define CVY_MAX_DEVNAME_LEN 48 /* The actual length of \device\guid is 46, but 48 was chosen for word alignment. */
|
||
|
|
||
|
/* These flags indicate which options are being used/specified and/or additional information for the remote protocol. */
|
||
|
|
||
|
/* For queries. */
|
||
|
#define IOCTL_OPTIONS_QUERY_CLUSTER_MEMBER 0x00000001 /* The initiator is part of the cluster it is querying. */
|
||
|
#define IOCTL_OPTIONS_QUERY_HOSTNAME 0x00000002 /* Return the hostname when a remote query is performed. */
|
||
|
|
||
|
/* For port rule operations. */
|
||
|
#define IOCTL_OPTIONS_PORTS_VIP_SPECIFIED 0x00000001 /* A VIP has been specified to check against. */
|
||
|
|
||
|
/* For state queries. */
|
||
|
|
||
|
#if defined (SBH)
|
||
|
//
|
||
|
// For IOCTL_CVY_QUERY_PERF
|
||
|
//
|
||
|
typedef struct
|
||
|
{
|
||
|
USHORT QueryState; // same as IOCTL_CVY_BUF::data.query.state
|
||
|
USHORT HostId;
|
||
|
ULONG HostMap;
|
||
|
|
||
|
//
|
||
|
// Heartbeat including ethernet header
|
||
|
//
|
||
|
|
||
|
UCHAR EthernetDstAddr[6];
|
||
|
UCHAR EthernetSrcAddr[6];
|
||
|
|
||
|
ULONG HeartbeatVersion;
|
||
|
ULONG ClusterIp;
|
||
|
ULONG DedicatedIp;
|
||
|
|
||
|
USHORT master_id;
|
||
|
USHORT state; /* my host's state */
|
||
|
USHORT nrules; /* # active rules */
|
||
|
ULONG UniqueCode; /* unique host code */
|
||
|
ULONG pkt_count; // Count of packets handled since cvg'd
|
||
|
// Updated only during convergence
|
||
|
ULONG teaming; /* Includes BDA teaming configuration. */
|
||
|
ULONG reserved2;
|
||
|
ULONG rcode[CVY_MAX_RULES]; /* rule code */
|
||
|
ULONGLONG cur_map[CVY_MAX_RULES]; /* my current load map for each port group */
|
||
|
ULONGLONG new_map[CVY_MAX_RULES]; /* my new load map for each port group */
|
||
|
/* if converging */
|
||
|
ULONGLONG idle_map[CVY_MAX_RULES]; /* map of idle bins for each port group */
|
||
|
ULONGLONG rdy_bins[CVY_MAX_RULES]; /* my rdy to send bins for each port group */
|
||
|
ULONG load_amt[CVY_MAX_RULES]; /* my load amount for each port group */
|
||
|
ULONG pg_rsvd1[CVY_MAX_RULES]; /* reserved */
|
||
|
|
||
|
//
|
||
|
// Load module
|
||
|
//
|
||
|
ULONG Convergence;
|
||
|
ULONG nDescAllocated;
|
||
|
ULONG nDescInUse;
|
||
|
ULONG PacketCount;
|
||
|
ULONGLONG AllIdleMap[CVY_MAX_RULES];
|
||
|
ULONGLONG CurrentMap[CVY_MAX_RULES][CVY_MAX_HOSTS];
|
||
|
ULONG DirtyClientWaiting;
|
||
|
}CVY_DRIVER_PERF, *PCVY_DRIVER_PERF;
|
||
|
#endif /* SBH */
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
typedef enum {
|
||
|
NLB_CONN_UP = 0,
|
||
|
NLB_CONN_DOWN,
|
||
|
NLB_CONN_RESET
|
||
|
} NLB_CONN_NOTIFICATION_OPERATION;
|
||
|
|
||
|
#if defined (NLB_SESSION_SUPPORT)
|
||
|
|
||
|
#define NLB_ERROR_SUCCESS 0x00000000
|
||
|
#define NLB_ERROR_GENERIC_FAILURE 0x00000001
|
||
|
#define NLB_ERROR_INVALID_PARAMETER 0x00000002
|
||
|
#define NLB_ERROR_REQUEST_REFUSED 0x00000003
|
||
|
#define NLB_ERROR_NOT_BOUND 0x00000004
|
||
|
#define NLB_ERROR_NOT_FOUND 0x00000005
|
||
|
|
||
|
/* IOCTL input buffer for connection notification from user space. */
|
||
|
typedef struct {
|
||
|
ULONG ReturnCode; /* The status of the operation upon return. */
|
||
|
ULONG Version; /* The version number for checking between user and kernel space. */
|
||
|
NLB_CONN_NOTIFICATION_OPERATION Operation; /* The operation to perform - UP/DOWN/RESET. */
|
||
|
|
||
|
ULONG ClientIPAddress; /* The IP address of the client in network byte order. */
|
||
|
ULONG ServerIPAddress; /* The IP address of the server in network byte order. */
|
||
|
USHORT ClientPort; /* The client port number. */
|
||
|
USHORT ServerPort; /* The server port number. */
|
||
|
USHORT Protocol; /* The protocol of the packet in question. */
|
||
|
USHORT Reserved; /* For byte alignment - reserved for later. */
|
||
|
} IOCTL_CONN_NOTIFICATION, * PIOCTL_CONN_NOTIFICATION;
|
||
|
#endif
|
||
|
|
||
|
#define NLB_QUERY_STATE_SUCCESS 1500
|
||
|
#define NLB_QUERY_STATE_FAILURE 1501
|
||
|
|
||
|
/* These are the supported state query operations. */
|
||
|
typedef enum {
|
||
|
NLB_QUERY_REG_PARAMS = 0, /* Retrieve the registry parameters from the driver state. */
|
||
|
NLB_QUERY_PORT_RULE_STATE, /* Retrieve the current port rule state. */
|
||
|
NLB_QUERY_BDA_TEAM_STATE, /* Retrieve the current BDA teaming state. */
|
||
|
NLB_QUERY_PACKET_STATISTICS, /* Retrieve the current packet handling statistics. */
|
||
|
NLB_QUERY_PACKET_FILTER /* Retrieve packet filtering information. */
|
||
|
} NLB_QUERY_STATE_OPERATION;
|
||
|
|
||
|
/* These are the possible responses from the load packet filter
|
||
|
state query, which returns accept/reject status for a given
|
||
|
IP tuple and protocol, based on the current driver state. */
|
||
|
typedef enum {
|
||
|
NLB_REJECT_LOAD_MODULE_INACTIVE = 0, /* Packet rejected because the load module is inactive. */
|
||
|
NLB_REJECT_CLUSTER_STOPPED, /* Packet rejected because NLB is stopped on this adapter. */
|
||
|
NLB_REJECT_PORT_RULE_DISABLED, /* Packet rejected because the applicable port rule's filtering mode is disabled. */
|
||
|
NLB_REJECT_CONNECTION_DIRTY, /* Packet rejected because the connection was marked dirty. */
|
||
|
NLB_REJECT_OWNED_ELSEWHERE, /* Packet rejected because the packet is owned by another host. */
|
||
|
NLB_REJECT_BDA_TEAMING_REFUSED, /* Packet rejected because BDA teaming refused to process it. */
|
||
|
NLB_ACCEPT_UNCONDITIONAL_OWNERSHIP, /* Packet accepted because this host owns it unconditionally (optimized mode). */
|
||
|
NLB_ACCEPT_FOUND_MATCHING_DESCRIPTOR, /* Packet accepted because we found a matching connection descriptor. */
|
||
|
NLB_ACCEPT_PASSTHRU_MODE, /* Packet accepted because the cluster is in passthru mode. */
|
||
|
NLB_ACCEPT_DIP_OR_BROADCAST, /* Packet accepted because its was sent to a bypassed address. */
|
||
|
NLB_ACCEPT_REMOTE_CONTROL_REQUEST, /* Packet accepted because it is an NLB remote control packet. */
|
||
|
NLB_ACCEPT_REMOTE_CONTROL_RESPONSE /* Packet accepted because it is an NLB remote control packet. */
|
||
|
} NLB_QUERY_PACKET_FILTER_RESPONSE;
|
||
|
|
||
|
/* This structure is used to query packet filtering information from the driver
|
||
|
about a particular connection. Given a IP tuple (client IP, client port,
|
||
|
server IP, server port) and a protocol, determine whether or not this host
|
||
|
would accept the packet and why or why not. It is important that this is
|
||
|
performed completely unobtrusively and has no side-effects on the actual
|
||
|
operation of NLB and the load module. */
|
||
|
typedef struct {
|
||
|
ULONG ClientIPAddress; /* The IP address of the client in network byte order. */
|
||
|
ULONG ServerIPAddress; /* The IP address of the server in network byte order. */
|
||
|
USHORT ClientPort; /* The client port number. */
|
||
|
USHORT ServerPort; /* The server port number. */
|
||
|
USHORT Protocol; /* The protocol of the packet in question. */
|
||
|
USHORT Reserved; /* For byte alignment - reserved for later. */
|
||
|
|
||
|
struct {
|
||
|
NLB_QUERY_PACKET_FILTER_RESPONSE Accept; /* The response - reason for accepting or rejecting the packet. */
|
||
|
|
||
|
struct {
|
||
|
USHORT Valid; /* Whether or not the driver has filled in the descriptor information. */
|
||
|
USHORT Reserved; /* For byte alignment - reserved for later. */
|
||
|
USHORT Alloc; /* Whether this descriptor is from the hash table or queue. */
|
||
|
USHORT Dirty; /* Whether this connection is dirty or not. */
|
||
|
ULONG FinCount; /* The number of FINs seen on this connection - TCP only. */
|
||
|
} DescriptorInfo;
|
||
|
|
||
|
struct {
|
||
|
USHORT Valid; /* Whether or not the driver has filled in the hashing information. */
|
||
|
USHORT Reserved; /* For byte alignment - reserved for later. */
|
||
|
ULONG Bin; /* The "bucket" which this tuple mapped to - from 0 to 59. */
|
||
|
ULONG ActiveConnections; /* The number of active connections on this "bucket". */
|
||
|
ULONGLONG CurrentMap; /* The current "bucket" map for the applicable port rule. */
|
||
|
ULONGLONG AllIdleMap; /* The all idle "bucket" map for the applicable port rule. */
|
||
|
} HashInfo;
|
||
|
} Results;
|
||
|
} IOCTL_QUERY_STATE_PACKET_FILTER, * PIOCTL_QUERY_STATE_PACKET_FILTER;
|
||
|
|
||
|
/* This structure is used by all query state IOCTLS to retrieve the specified
|
||
|
state information from the driver, including load module state, port rule
|
||
|
state, packet statistics and BDA teaming. */
|
||
|
typedef struct {
|
||
|
ULONG ReturnCode; /* The status of the operation upon return. */
|
||
|
ULONG Version; /* The version number for checking between user and kernel space. */
|
||
|
NLB_QUERY_STATE_OPERATION Operation; /* The operation to perform. */
|
||
|
|
||
|
union {
|
||
|
IOCTL_QUERY_STATE_PACKET_FILTER Filter; /* The input/output buffer for packet filter queries. */
|
||
|
};
|
||
|
} IOCTL_QUERY_STATE, * PIOCTL_QUERY_STATE;
|
||
|
|
||
|
/* This structure is used by most of the existing IOCTL and remote control operations,
|
||
|
including queries, cluster control and port rule control. */
|
||
|
typedef union
|
||
|
{
|
||
|
ULONG ret_code;
|
||
|
union {
|
||
|
struct {
|
||
|
USHORT state;
|
||
|
USHORT host_id;
|
||
|
ULONG host_map;
|
||
|
} query;
|
||
|
struct {
|
||
|
ULONG load;
|
||
|
ULONG num;
|
||
|
} port;
|
||
|
} data;
|
||
|
} IOCTL_CVY_BUF, * PIOCTL_CVY_BUF;
|
||
|
|
||
|
/* This structure is used by IOCTL and remote control operations to provide extended
|
||
|
functionality beyond the legacy remote control protocol, which MUST remain backward
|
||
|
compatible with NT 4.0 and Windows 2000. */
|
||
|
typedef union {
|
||
|
UCHAR reserved[256]; /* Bite the bullet and reserve 256 bytes to allow for future expansion. */
|
||
|
|
||
|
union {
|
||
|
struct
|
||
|
{
|
||
|
ULONG flags; /* These flags indicate which options fields have been specified. */
|
||
|
WCHAR hostname[CVY_MAX_HOST_NAME + 1]; /* Host name filled in by NLB on remote control reply. */
|
||
|
} query;
|
||
|
struct
|
||
|
{
|
||
|
ULONG flags; /* These flags indicate which options fields have been specified. */
|
||
|
ULONG virtual_ip_addr; /* For virtual clusters, the VIP, which can be 0x00000000, 0xffffffff or a specific VIP. */
|
||
|
} port;
|
||
|
struct
|
||
|
{
|
||
|
ULONG flags; /* These flags indicate which options fields have been specified. */
|
||
|
IOCTL_QUERY_STATE query; /* This is the input/output buffer for querying driver state. */
|
||
|
} state;
|
||
|
#if defined (NLB_SESSION_SUPPORT)
|
||
|
struct
|
||
|
{
|
||
|
ULONG flags; /* These flags indicate which options fields have been specified. */
|
||
|
IOCTL_CONN_NOTIFICATION conn; /* The input/output buffer for connection notifications from upper-layer protocols. */
|
||
|
} notify;
|
||
|
#endif
|
||
|
};
|
||
|
} IOCTL_OPTIONS, * PIOCTL_OPTIONS;
|
||
|
|
||
|
typedef struct {
|
||
|
WCHAR device_name[CVY_MAX_DEVNAME_LEN]; /* Identifies the adapter. */
|
||
|
IOCTL_CVY_BUF ctrl; /* The IOCTL information. */
|
||
|
IOCTL_OPTIONS options; /* Optionally specified parameters. */
|
||
|
} IOCTL_LOCAL_HDR, * PIOCTL_LOCAL_HDR;
|
||
|
|
||
|
/* These macros define the remote control packets lengths based on Windows and NLB versions,
|
||
|
so that error checking can be done upon the reception of a remote control packet. */
|
||
|
#define NLB_MIN_RCTL_PACKET_LEN(ip_hdrp) ((sizeof(ULONG) * IP_GET_HLEN(ip_hdrp)) + sizeof(UDP_HDR) + sizeof(IOCTL_REMOTE_HDR) - sizeof(IOCTL_OPTIONS))
|
||
|
#define NLB_NT40_RCTL_PACKET_LEN(ip_hdrp) ((sizeof(ULONG) * IP_GET_HLEN(ip_hdrp)) + sizeof(UDP_HDR) + sizeof(IOCTL_REMOTE_HDR) - sizeof(IOCTL_OPTIONS))
|
||
|
#define NLB_WIN2K_RCTL_PACKET_LEN(ip_hdrp) ((sizeof(ULONG) * IP_GET_HLEN(ip_hdrp)) + sizeof(UDP_HDR) + sizeof(IOCTL_REMOTE_HDR) - sizeof(IOCTL_OPTIONS))
|
||
|
#define NLB_WINXP_RCTL_PACKET_LEN(ip_hdrp) ((sizeof(ULONG) * IP_GET_HLEN(ip_hdrp)) + sizeof(UDP_HDR) + sizeof(IOCTL_REMOTE_HDR))
|
||
|
#define NLB_MAX_RCTL_PACKET_LEN(ip_hdrp) ((sizeof(ULONG) * IP_GET_HLEN(ip_hdrp)) + sizeof(UDP_HDR) + sizeof(IOCTL_REMOTE_HDR))
|
||
|
|
||
|
/* This structure is the UDP data for NLB remote control messages. */
|
||
|
typedef struct {
|
||
|
ULONG code; /* Distinguishes remote packets. */
|
||
|
ULONG version; /* Software version. */
|
||
|
ULONG host; /* Destination host (0 or cluster IP address for master). */
|
||
|
ULONG cluster; /* Primary cluster IP address. */
|
||
|
ULONG addr; /* Dedicated IP address on the way back, client IP address on the way in. */
|
||
|
ULONG id; /* Message ID. */
|
||
|
ULONG ioctrl; /* IOCTRL code. */
|
||
|
IOCTL_CVY_BUF ctrl; /* Control buffer. */
|
||
|
ULONG password; /* Encoded password. */
|
||
|
IOCTL_OPTIONS options; /* Optionally specified parameters. */
|
||
|
} IOCTL_REMOTE_HDR, * PIOCTL_REMOTE_HDR;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
#endif /* _Wlbsiocl_h_ */
|