/*++

Copyright (c) 1992-1996  Microsoft Corporation

Module Name:

    ioctl.h

Abstract:

    This file contains the ioctl declarations for the atmarp server.

Author:

    Jameel Hyder (jameelh@microsoft.com)	July 1996

Environment:

    Kernel mode

Revision History:

--*/

#ifndef	_IOCTL_
#define	_IOCTL_

#define	ARP_SERVER_DEVICE_NAME			L"\\Device\\AtmArpServer"
#define	ARP_SERVER_DOS_DEVICE_NAME		L"\\\\.\\AtmArpServer"
#define	ARP_SERVER_SYMBOLIC_NAME		L"\\DosDevices\\AtmArpServer"

#define	ARPS_IOCTL_QUERY_INTERFACES		CTL_CODE(FILE_DEVICE_NETWORK, 100, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_FLUSH_ARPCACHE		CTL_CODE(FILE_DEVICE_NETWORK, 101, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_QUERY_ARPCACHE		CTL_CODE(FILE_DEVICE_NETWORK, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_ADD_ARPENTRY			CTL_CODE(FILE_DEVICE_NETWORK, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_QUERY_IP_FROM_ATM	CTL_CODE(FILE_DEVICE_NETWORK, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_QUERY_ATM_FROM_IP	CTL_CODE(FILE_DEVICE_NETWORK, 105, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define	ARPS_IOCTL_QUERY_ARP_STATISTICS	CTL_CODE(FILE_DEVICE_NETWORK, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_QUERY_MARSCACHE		CTL_CODE(FILE_DEVICE_NETWORK, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_QUERY_MARS_STATISTICS CTL_CODE(FILE_DEVICE_NETWORK, 111, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define	ARPS_IOCTL_RESET_STATISTICS 	CTL_CODE(FILE_DEVICE_NETWORK, 112, METHOD_BUFFERED, FILE_ANY_ACCESS)


typedef enum
{
	QUERY_IP_FROM_ATM,
    QUERY_ATM_FROM_IP,
    ADD_ARP_ENTRY
} OPERATION;

//
// All Ptrs are represented by offsets from the beginning of the structures.
//
typedef	UNICODE_STRING	INTERFACE_NAME, *PINTERFACE_NAME;

typedef struct
{
	IPADDR		IpAddr;
	ATM_ADDRESS	AtmAddress;
	ATM_ADDRESS	SubAddress;
} ARPENTRY, *PARPENTRY;


typedef struct
{
	UINT			NumberOfInterfaces;
	INTERFACE_NAME	Interfaces[1];
} INTERFACES, *PINTERFACES;

typedef union
{
	INTERFACE_NAME			Name;
	ARPENTRY				ArpEntry;
} IOCTL_QA_ENTRY, *PIOCTL_QA_ENTRY;

typedef	union
{
	struct QUERY_ARP_CACHE_INPUT_PARAMS
	{
		UINT				StartEntryIndex;
		INTERFACE_NAME		Name;
	};
	struct QUERY_ARP_CACHE_OUTPUT_PARAMS
	{
		UINT				TotalNumberOfEntries;
		UINT				NumberOfEntriesInBuffer;
		ARPENTRY			Entries[1];
	} Entries;
} IOCTL_QUERY_CACHE, *PIOCTL_QUERY_CACHE;


typedef struct
{
	UINT	ElapsedSeconds;
	UINT	TotalRecvPkts;
	UINT	DiscardedRecvPkts;

	UINT	CurrentArpEntries;
	UINT	MaxArpEntries;
	UINT	Acks;
	UINT	Naks;
	UINT	CurrentClientVCs;
	UINT	MaxClientVCs;
	UINT	TotalActiveVCs;
	UINT	TotalIncomingCalls;		// for both arps and mars
	UINT	FailedIncomingCalls;	// for both arps and mars

} ARP_SERVER_STATISTICS, *PARP_SERVER_STATISTICS;

	
typedef struct
{
	UINT	ElapsedSeconds;
	UINT	TotalRecvPkts;
	UINT	DiscardedRecvPkts;

	UINT	TotalMCDataPkts;
	UINT	DiscardedMCDataPkts;
	UINT	ReflectedMCDataPkts;

	UINT	CurrentClusterMembers;
	UINT	MaxClusterMembers;
	UINT	TotalCCVCAddParties;
	UINT	FailedCCVCAddParties;

	UINT	RegistrationRequests;
	UINT	FailedRegistrations;

	UINT	TotalJoins;
	UINT	FailedJoins;
	UINT	DuplicateJoins;
	UINT 	SuccessfulVCMeshJoins;
	UINT	TotalLeaves;
	UINT	FailedLeaves;

	UINT	TotalRequests;
	UINT	Naks;
	UINT	VCMeshAcks;
	UINT	MCSAcks;

	UINT	CurrentGroups; 	// vc-mesh
	UINT	MaxGroups; 		// vc-mesh
	UINT	CurrentPromiscuous;
	UINT	MaxPromiscuous;
	UINT	MaxAddressesPerGroup;

} MARS_SERVER_STATISTICS, *PMARS_SERVER_STATISTICS;

//
//		MARS-specific entries.
//

typedef struct
{
	IPADDR	  IpAddr;
	ULONG	  Flags;     				// One or more MARSENTRY_* flags below
	ULONG	  NumAtmAddresses;
	ULONG	  OffsetAtmAddresses;		// From the start of THIS structure.
										// NOTE: we do not report subaddresses
										// Will be 0 if there are no addresses
										// present in the buffer (typically
										// because there is not enough space
										// to store them all).

} MARSENTRY, *PMARSENTRY;

#define MARSENTRY_MCS_SERVED	0x1			// Group is MCS served

#define	SIG_MARSENTRY 0xf69052f5

typedef	union
{
	struct QUERY_MARS_CACHE_INPUT_PARAMS
	{
		UINT				StartEntryIndex;
		INTERFACE_NAME		Name;
	};

	struct QUERY_MARS_CACHE_OUTPUT_PARAMS
	{
		ULONG				Sig;		// Set to SIG_MARSENTRY
		UINT				TotalNumberOfEntries;
		UINT				NumberOfEntriesInBuffer;
		MARSENTRY			Entries[1];

	} MarsCache;

} IOCTL_QUERY_MARS_CACHE, *PIOCTL_QUERY_MARS_CACHE;

#endif	// _IOCTL_