windows-nt/Source/XPSP1/NT/net/rras/netsh/ip/sample/ipsamplerm.h
2020-09-26 16:20:57 +08:00

278 lines
8.8 KiB
C

/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
ipsamplerm.h
Abstract:
The file contains type definitions and declarations for SAMPLE, the
sample ip protocol, used by the IP Router Manager.
--*/
#ifndef _IPSAMPLERM_H_
#define _IPSAMPLERM_H_
// useful for variable sized structs
#undef ANY_SIZE
#define ANY_SIZE 0
//----------------------------------------------------------------------------
// CONSTANT AND MACRO DECLARATIONS
//----------------------------------------------------------------------------
#define PROTO_IP_SAMPLE 200
#define MS_IP_SAMPLE \
PROTOCOL_ID(PROTO_TYPE_UCAST, PROTO_VENDOR_MS0, PROTO_IP_SAMPLE)
#define SAMPLE_PROTOCOL_MULTICAST_GROUP ((DWORD)0x640000E0) // 224.0.0.100
//----------------------------------------------------------------------------
// constants identifying IPSAMPLE's MIB tables
//----------------------------------------------------------------------------
#define IPSAMPLE_GLOBAL_STATS_ID 0
#define IPSAMPLE_GLOBAL_CONFIG_ID 1
#define IPSAMPLE_IF_STATS_ID 2
#define IPSAMPLE_IF_CONFIG_ID 3
#define IPSAMPLE_IF_BINDING_ID 4
//----------------------------------------------------------------------------
// constants used for the field IPSAMPLE_GLOBAL_CONFIG::dwLoggingLevel
//----------------------------------------------------------------------------
#define IPSAMPLE_LOGGING_NONE 0
#define IPSAMPLE_LOGGING_ERROR 1
#define IPSAMPLE_LOGGING_WARN 2
#define IPSAMPLE_LOGGING_INFO 3
//----------------------------------------------------------------------------
// constants used for the field IPSAMPLE_IF_CONFIG::ulMetric
//----------------------------------------------------------------------------
#define IPSAMPLE_METRIC_INFINITE 16
//----------------------------------------------------------------------------
// constants used to construct the field IPSAMPLE_IF_BINDING::dwState
//----------------------------------------------------------------------------
#define IPSAMPLE_STATE_ACTIVE 0x00000001
#define IPSAMPLE_STATE_BOUND 0x00000002
//----------------------------------------------------------------------------
// STRUCTURE DEFINITIONS
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// struct: IPSAMPLE_GLOBAL_STATS
//
// This MIB entry stores global statistics for IPSAMPLE;
// There is only one instance, so this entry has no index.
//
// This structure is read-only.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_GLOBAL_STATS
{
ULONG ulNumInterfaces; // # interfaces added
} IPSAMPLE_GLOBAL_STATS, *PIPSAMPLE_GLOBAL_STATS;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_GLOBAL_CONFIG
//
// This MIB entry stores global configuration for IPSAMPLE
// There is only one instance, so this entry has no index.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_GLOBAL_CONFIG
{
DWORD dwLoggingLevel;
} IPSAMPLE_GLOBAL_CONFIG, *PIPSAMPLE_GLOBAL_CONFIG;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_IF_STATS
//
// This MIB entry stores per-interface statistics for IPSAMPLE.
//
// This structure is read-only.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_IF_STATS
{
ULONG ulNumPackets; // # packets sent out this interface
} IPSAMPLE_IF_STATS, *PIPSAMPLE_IF_STATS;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_IF_CONFIG
//
// This MIB entry describes per-interface configuration.
// All IP address fields must be in network order.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_IF_CONFIG
{
ULONG ulMetric;
} IPSAMPLE_IF_CONFIG, *PIPSAMPLE_IF_CONFIG;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_IF_BINDING
//
// This MIB entry contains the table of IP addresses to which each
// interface is bound. All IP addresses are in network order.
//
// THIS STRUCTURE IS VARIABLE LENGTH:
//
// The base structure contains of the field ulCount, which gives the
// number of IP addresses to which the indexed interface is bound. The
// IP addresses themselves follow the base structure, and are given as
// IPSAMPLE_IP_ADDRESS structures.
//
// This MIB entry is read-only.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_IF_BINDING
{
DWORD dwState;
ULONG ulCount;
} IPSAMPLE_IF_BINDING, *PIPSAMPLE_IF_BINDING;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_IP_ADDRESS
//
// This structure is used for storing interface bindings. A series of
// structures of this type follows the IPSAMPLE_IF_BINDING structure
// (described above).
//
// Both fields are IP address fields in network-order.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_IP_ADDRESS
{
DWORD dwAddress;
DWORD dwMask;
} IPSAMPLE_IP_ADDRESS, *PIPSAMPLE_IP_ADDRESS;
//----------------------------------------------------------------------------
// macros for manipulating the variable-length IPSAMPLE_IF_BINDING structure
//
// IPSAMPLE_IF_BINDING_SIZE computes the size of a binding structure.
//
// IPSAMPLE_IF_ADDRESS_TABLE computes the starting address in a binding
// struct of the series of IPSAMPLE_IP_ADDRESS structures which are
// the bindings for the interface in question.
//
// e.g.
// PIPSAMPLE_IF_BINDING piibSource, piibDest;
//
// piibDest = malloc(IPSAMPLE_IF_BINDING_SIZE(piibSource));
// memcpy(piibDest, piibSource, IPSAMPLE_IF_BINDING_SIZE(piibSource));
//
// e.g.
// ULONG i;
// PIPSAMPLE_IF_BINDING piib;
// PIPSAMPLE_IP_ADDRESS *piia;
//
// piia = IPSAMPLE_IF_ADDRESS_TABLE(piib);
// for (i = 0; i < piib->ulCount; i++)
// {
// printf("%s-", inet_ntoa(*(struct in_addr *)&piia->dwAddress));
// printf("%s\n", inet_ntoa(*(struct in_addr *)&piia->dwMask));
// }
//----------------------------------------------------------------------------
#define IPSAMPLE_IF_BINDING_SIZE(bind) \
(sizeof(IPSAMPLE_IF_BINDING) + \
(bind)->ulCount * sizeof(IPSAMPLE_IP_ADDRESS))
#define IPSAMPLE_IF_ADDRESS_TABLE(bind) \
((PIPSAMPLE_IP_ADDRESS)((bind) + 1))
//----------------------------------------------------------------------------
// The following structures are used to query the MIB and get back a
// response. The TypeID field is one of the IDs #defined above. The
// IfIndex is used to reference an interface table entry . For sample
// it corresponds to an ip address, and hence is a single DWORD for now.
// In general the index could be a variable size array of DWORDs.
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// struct: IPSAMPLE_MIB_SET_INPUT_DATA
//
// This is passed as input data for MibSet.
// Note that only global config and interface config can be set.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_MIB_SET_INPUT_DATA
{
DWORD IMSID_TypeID;
DWORD IMSID_IfIndex;
DWORD IMSID_BufferSize;
BYTE IMSID_Buffer[ANY_SIZE];
} IPSAMPLE_MIB_SET_INPUT_DATA, *PIPSAMPLE_MIB_SET_INPUT_DATA;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_MIB_GET_INPUT_DATA
//
// This is passed as input data for MibGet, MibGetFirst, MibGetNext. All
// tables are readable. All IP addresses must be in network order.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_MIB_GET_INPUT_DATA
{
DWORD IMGID_TypeID;
DWORD IMGID_IfIndex;
} IPSAMPLE_MIB_GET_INPUT_DATA, *PIPSAMPLE_MIB_GET_INPUT_DATA;
//----------------------------------------------------------------------------
// struct: IPSAMPLE_MIB_GET_OUTPUT_DATA
//
// This is written into the output data by MibGet, MibGetFirst, MibGetNext.
//----------------------------------------------------------------------------
typedef struct _IPSAMPLE_MIB_GET_OUTPUT_DATA
{
DWORD IMGOD_TypeID;
DWORD IMGOD_IfIndex;
BYTE IMGOD_Buffer[ANY_SIZE];
} IPSAMPLE_MIB_GET_OUTPUT_DATA, *PIPSAMPLE_MIB_GET_OUTPUT_DATA;
#endif // _IPSAMPLERM_H_