278 lines
8.8 KiB
C
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_
|