|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
private\inc\ddipmcst.h
Abstract:
Public IOCTLS and related structures for IP Multicasting See documentation for more details
Author:
Amritansh Raghav
Revision History:
AmritanR Created
Notes:
--*/
#ifndef __DDIPMCAST_H__
#define __DDIPMCAST_H__
#ifndef ANY_SIZE
#define ANY_SIZE 1
#endif
//////////////////////////////////////////////////////////////////////////////
// //
// Device Name - this string is the name of the device. It is the name //
// that should be passed to NtCreateFile when accessing the device. //
// //
//////////////////////////////////////////////////////////////////////////////
#define DD_IPMCAST_DEVICE_NAME L"\\Device\\IPMULTICAST"
//////////////////////////////////////////////////////////////////////////////
// //
// Win32 Name - This is the (Unicode and NonUnicode) name exposed by Win32 //
// subsystem for the device. It is the name that should be passed to //
// CreateFile(Ex) when opening the device. //
// //
//////////////////////////////////////////////////////////////////////////////
#define IPMCAST_NAME L"\\\\.\\IPMULTICAST"
#define IPMCAST_NAME_NUC "\\\\.\\IPMULTICAST"
//////////////////////////////////////////////////////////////////////////////
// //
// IOCTL code definitions and related structures //
// All the IOCTLs are synchronous except for IOCTL_POST_NOTIFICATION //
// All need need administrator privilege //
// //
//////////////////////////////////////////////////////////////////////////////
#define FSCTL_IPMCAST_BASE FILE_DEVICE_NETWORK
#define _IPMCAST_CTL_CODE(function, method, access) \
CTL_CODE(FSCTL_IPMCAST_BASE, function, method, access)
#define MIN_IPMCAST_CODE 0
#define SET_MFE_CODE (MIN_IPMCAST_CODE)
#define GET_MFE_CODE (SET_MFE_CODE + 1)
#define DELETE_MFE_CODE (GET_MFE_CODE + 1)
#define SET_TTL_CODE (DELETE_MFE_CODE + 1)
#define GET_TTL_CODE (SET_TTL_CODE + 1)
#define POST_NOTIFICATION_CODE (GET_TTL_CODE + 1)
#define START_STOP_CODE (POST_NOTIFICATION_CODE + 1)
#define SET_IF_STATE_CODE (START_STOP_CODE + 1)
#define MAX_IPMCAST_CODE (SET_IF_STATE_CODE)
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to set an MFE. //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_SET_MFE \
_IPMCAST_CTL_CODE(SET_MFE_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
//
// WARNING WARNING!!!
// The following structures are also called MIB_XXX in iprtrmib.h. There
// is code in routing\ip\rtrmgr\access.c which assumes the structures are
// the same. If this ever changes, the code in access.c needs to be fixed
//
typedef struct _IPMCAST_OIF { IN DWORD dwOutIfIndex; IN DWORD dwNextHopAddr; IN DWORD dwDialContext; IN DWORD dwReserved; }IPMCAST_OIF, *PIPMCAST_OIF;
//
// This must be the same as INVALID_WANARP_CONTEXT
//
#define INVALID_DIAL_CONTEXT 0x00000000
typedef struct _IPMCAST_MFE { IN DWORD dwGroup; IN DWORD dwSource; IN DWORD dwSrcMask; IN DWORD dwInIfIndex; IN ULONG ulNumOutIf; IN ULONG ulTimeOut; IN DWORD fFlags; IN DWORD dwReserved; IN IPMCAST_OIF rgioOutInfo[ANY_SIZE]; }IPMCAST_MFE, *PIPMCAST_MFE;
#define SIZEOF_BASIC_MFE \
(ULONG)(FIELD_OFFSET(IPMCAST_MFE, rgioOutInfo[0]))
#define SIZEOF_MFE(X) \
(SIZEOF_BASIC_MFE + ((X) * sizeof(IPMCAST_OIF)))
//////////////////////////////////////////////////////////////////////////////
// //
// This IOCTL is used to retrieve an MFE and all the related statistics //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_GET_MFE \
_IPMCAST_CTL_CODE(GET_MFE_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPMCAST_OIF_STATS { OUT DWORD dwOutIfIndex; OUT DWORD dwNextHopAddr; OUT DWORD dwDialContext; OUT ULONG ulTtlTooLow; OUT ULONG ulFragNeeded; OUT ULONG ulOutPackets; OUT ULONG ulOutDiscards; }IPMCAST_OIF_STATS, *PIPMCAST_OIF_STATS;
typedef struct _IPMCAST_MFE_STATS { IN DWORD dwGroup; IN DWORD dwSource; IN DWORD dwSrcMask; OUT DWORD dwInIfIndex; OUT ULONG ulNumOutIf; OUT ULONG ulInPkts; OUT ULONG ulInOctets; OUT ULONG ulPktsDifferentIf; OUT ULONG ulQueueOverflow; OUT ULONG ulUninitMfe; OUT ULONG ulNegativeMfe; OUT ULONG ulInDiscards; OUT ULONG ulInHdrErrors; OUT ULONG ulTotalOutPackets;
OUT IPMCAST_OIF_STATS rgiosOutStats[ANY_SIZE]; }IPMCAST_MFE_STATS, *PIPMCAST_MFE_STATS;
#define SIZEOF_BASIC_MFE_STATS \
(ULONG)(FIELD_OFFSET(IPMCAST_MFE_STATS, rgiosOutStats[0]))
#define SIZEOF_MFE_STATS(X) \
(SIZEOF_BASIC_MFE_STATS + ((X) * sizeof(IPMCAST_OIF_STATS)))
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to delete an MFE. //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_DELETE_MFE \
_IPMCAST_CTL_CODE(DELETE_MFE_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPMCAST_DELETE_MFE { IN DWORD dwGroup; IN DWORD dwSource; IN DWORD dwSrcMask; }IPMCAST_DELETE_MFE, *PIPMCAST_DELETE_MFE;
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL set the TTL scope for an interface. If a packet has a lower //
// TTL than the scope, it will be dropped //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_SET_TTL \
_IPMCAST_CTL_CODE(SET_TTL_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
#define IOCTL_IPMCAST_GET_TTL \
_IPMCAST_CTL_CODE(GET_TTL_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPMCAST_IF_TTL { IN OUT DWORD dwIfIndex; IN OUT BYTE byTtl; }IPMCAST_IF_TTL, *PIPMCAST_IF_TTL;
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to post a notification to the Multicast Driver. This //
// is the only asynchronous IOCTL. When the IOCTL completes, the driver //
// returns a message to the user mode component. The message type (dwEvent) //
// and the corresponding data is defined below //
// //
//////////////////////////////////////////////////////////////////////////////
#define IPMCAST_RCV_PKT_MSG 0
#define IPMCAST_DELETE_MFE_MSG 1
#define IPMCAST_WRONG_IF_MSG 2
#define IOCTL_IPMCAST_POST_NOTIFICATION \
_IPMCAST_CTL_CODE(POST_NOTIFICATION_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
#define PKT_COPY_SIZE 256
typedef struct _IPMCAST_PKT_MSG { OUT DWORD dwInIfIndex; OUT DWORD dwInNextHopAddress; OUT ULONG cbyDataLen; OUT BYTE rgbyData[PKT_COPY_SIZE]; }IPMCAST_PKT_MSG, *PIPMCAST_PKT_MSG;
#define SIZEOF_PKT_MSG(p) \
(FIELD_OFFSET(IPMCAST_PKT_MSG, rgbyData) + (p)->cbyDataLen)
//
// Since the msg is big because of packet msg, we may as well
// pack more than one MFE into the delete msg
//
#define NUM_DEL_MFES PKT_COPY_SIZE/sizeof(IPMCAST_DELETE_MFE)
typedef struct _IPMCAST_MFE_MSG { OUT ULONG ulNumMfes; OUT IPMCAST_DELETE_MFE idmMfe[NUM_DEL_MFES]; }IPMCAST_MFE_MSG, *PIPMCAST_MFE_MSG;
#define SIZEOF_MFE_MSG(p) \
(FIELD_OFFSET(IPMCAST_MFE_MSG, idmMfe) + ((p)->ulNumMfes * sizeof(IPMCAST_DELETE_MFE)))
typedef struct _IPMCAST_NOTIFICATION { OUT DWORD dwEvent; union { IPMCAST_PKT_MSG ipmPkt; IPMCAST_MFE_MSG immMfe; }; }IPMCAST_NOTIFICATION, *PIPMCAST_NOTIFICATION;
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to start or stop multicasting. The corresponding buffer //
// is a DWORD which is set to 1 to start the driver and to 0 to stop it //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_START_STOP \
_IPMCAST_CTL_CODE(START_STOP_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to set the state on an interface. //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPMCAST_SET_IF_STATE \
_IPMCAST_CTL_CODE(SET_IF_STATE_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPMCAST_IF_STATE { IN DWORD dwIfIndex; IN BYTE byState;
}IPMCAST_IF_STATE, *PIPMCAST_IF_STATE;
#endif // __DDIPMCST_H__
|