You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
11 KiB
303 lines
11 KiB
/*++
|
|
|
|
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__
|