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.
261 lines
6.3 KiB
261 lines
6.3 KiB
/*++
|
|
|
|
Copyright (c) 1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sample\networkentry.h
|
|
|
|
Abstract:
|
|
|
|
The file contains definitions for the network entry and associated data
|
|
structures.
|
|
|
|
--*/
|
|
|
|
#ifndef _NETWORKENTRY_H_
|
|
#define _NETWORKENTRY_H_
|
|
|
|
|
|
//
|
|
// TYPE DEFINITIONS FOR INTERFACE MANAGEMENT
|
|
//
|
|
|
|
//
|
|
// struct: BINDING_ENTRY
|
|
//
|
|
// stores interface bindings, ip addresses to which an interface is bound.
|
|
// all ip addresses are in network byte order.
|
|
//
|
|
// protected by the read-write lock NETWORK_ENTRY::rwlLock.
|
|
//
|
|
|
|
typedef struct _BINDING_ENTRY
|
|
{
|
|
IPADDRESS ipAddress;
|
|
IPADDRESS ipMask;
|
|
} BINDING_ENTRY, *PBINDING_ENTRY;
|
|
|
|
DWORD
|
|
BE_CreateTable (
|
|
IN PIP_ADAPTER_BINDING_INFO pBinding,
|
|
OUT PBINDING_ENTRY *ppbeBindingTable,
|
|
OUT PIPADDRESS pipLowestAddress);
|
|
|
|
DWORD
|
|
BE_DestroyTable (
|
|
IN PBINDING_ENTRY pbeBindingTable);
|
|
|
|
#ifdef DEBUG
|
|
DWORD
|
|
BE_DisplayTable (
|
|
IN PBINDING_ENTRY pbeBindingTable,
|
|
IN ULONG ulNumBindings);
|
|
#else
|
|
#define BE_Display(pbe)
|
|
#endif // DEBUG
|
|
|
|
//
|
|
// VOID
|
|
// BE_FindTable (
|
|
// IN PBINDING_ENTRY pbeBindingTable,
|
|
// IN ULONG ulNumBindings,
|
|
// IN IPADDRESS ipAddress,
|
|
// IN IPADDRESS ipMask,
|
|
// OUT PULONG pulIndex
|
|
// );
|
|
//
|
|
|
|
#define BE_FindTable(table, num, address, mask, pindex) \
|
|
{ \
|
|
for (*(pindex) = 0; *(pindex) < (num); (*(pindex))++) \
|
|
if (!IP_COMPARE((table)[*(pindex)].ipAddress, (address)) and \
|
|
!IP_COMPARE((table)[*(pindex)].ipMask, (mask))) \
|
|
break; \
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// struct: INTERFACE_ENTRY
|
|
//
|
|
// stores per-interface information.
|
|
//
|
|
// protected by the read-write lock NETWORK_ENTRY::rwlLock.
|
|
//
|
|
|
|
// mib get modes
|
|
|
|
typedef enum { GET_EXACT, GET_FIRST, GET_NEXT } MODE;
|
|
|
|
|
|
typedef struct _INTERFACE_ENTRY
|
|
{
|
|
// Hash Table Link (primary access structure)
|
|
LIST_ENTRY leInterfaceTableLink;
|
|
|
|
// Index Sorted List Link (secondary access structure)
|
|
LIST_ENTRY leIndexSortedListLink;
|
|
|
|
// Interface Name (logging)
|
|
PWCHAR pwszIfName;
|
|
|
|
// Interface Index
|
|
DWORD dwIfIndex;
|
|
|
|
// Interface Address Bindings
|
|
ULONG ulNumBindings;
|
|
PBINDING_ENTRY pbeBindingTable;
|
|
|
|
// Interface Flags ENABLED, BOUND, ACTIVE, MULTIACCESS
|
|
DWORD dwFlags;
|
|
|
|
// Interface Address (lowest binding ip address for now) & Socket
|
|
IPADDRESS ipAddress;
|
|
SOCKET sRawSocket;
|
|
|
|
// Receive Event and Registered Wait
|
|
HANDLE hReceiveEvent;
|
|
HANDLE hReceiveWait;
|
|
|
|
// Periodic Timer
|
|
HANDLE hPeriodicTimer;
|
|
|
|
// Interface Configuration
|
|
DWORD ulMetric;
|
|
|
|
// Interface Statistics
|
|
IPSAMPLE_IF_STATS iisStats;
|
|
} INTERFACE_ENTRY, *PINTERFACE_ENTRY;
|
|
|
|
#define IEFLAG_ACTIVE 0x00000001
|
|
#define IEFLAG_BOUND 0x00000002
|
|
#define IEFLAG_MULTIACCESS 0x00000004
|
|
|
|
|
|
|
|
#define INTERFACE_IS_ACTIVE(i) \
|
|
((i)->dwFlags & IEFLAG_ACTIVE)
|
|
|
|
#define INTERFACE_IS_INACTIVE(i) \
|
|
!INTERFACE_IS_ACTIVE(i)
|
|
|
|
#define INTERFACE_IS_BOUND(i) \
|
|
((i)->dwFlags & IEFLAG_BOUND)
|
|
|
|
#define INTERFACE_IS_UNBOUND(i) \
|
|
!INTERFACE_IS_BOUND(i)
|
|
|
|
#define INTERFACE_IS_MULTIACCESS(i) \
|
|
((i)->dwFlags & IEFLAG_MULTIACCESS)
|
|
|
|
#define INTERFACE_IS_POINTTOPOINT(i) \
|
|
!INTERFACE_IS_MULTIACCESS(i)
|
|
|
|
|
|
|
|
DWORD
|
|
IE_Create (
|
|
IN PWCHAR pwszIfName,
|
|
IN DWORD dwIfIndex,
|
|
IN WORD wAccessType,
|
|
OUT PINTERFACE_ENTRY *ppieInterfaceEntry);
|
|
|
|
DWORD
|
|
IE_Destroy (
|
|
IN PINTERFACE_ENTRY pieInterfaceEntry);
|
|
|
|
#ifdef DEBUG
|
|
DWORD
|
|
IE_Display (
|
|
IN PINTERFACE_ENTRY pieInterfaceEntry);
|
|
#else
|
|
#define IE_Display(pieInterfaceEntry)
|
|
#endif // DEBUG
|
|
|
|
DWORD
|
|
IE_Insert (
|
|
IN PINTERFACE_ENTRY pieIfEntry);
|
|
|
|
DWORD
|
|
IE_Delete (
|
|
IN DWORD dwIfIndex,
|
|
OUT PINTERFACE_ENTRY *ppieIfEntry);
|
|
|
|
BOOL
|
|
IE_IsPresent (
|
|
IN DWORD dwIfIndex);
|
|
|
|
DWORD
|
|
IE_Get (
|
|
IN DWORD dwIfIndex,
|
|
OUT PINTERFACE_ENTRY *ppieIfEntry);
|
|
|
|
DWORD
|
|
IE_GetIndex (
|
|
IN DWORD dwIfIndex,
|
|
IN MODE mMode,
|
|
OUT PINTERFACE_ENTRY *ppieIfEntry);
|
|
|
|
DWORD
|
|
IE_BindInterface (
|
|
IN PINTERFACE_ENTRY pie,
|
|
IN PIP_ADAPTER_BINDING_INFO pBinding);
|
|
|
|
DWORD
|
|
IE_UnBindInterface (
|
|
IN PINTERFACE_ENTRY pie);
|
|
|
|
DWORD
|
|
IE_ActivateInterface (
|
|
IN PINTERFACE_ENTRY pie);
|
|
|
|
DWORD
|
|
IE_DeactivateInterface (
|
|
IN PINTERFACE_ENTRY pie);
|
|
|
|
|
|
|
|
|
|
//
|
|
// struct: NETWORK_ENTRY
|
|
//
|
|
// stores interface table and other network related information.
|
|
// the interface table is a hashed on the interface index.
|
|
//
|
|
// protected by the read-write lock NETWORK_ENTRY::rwlLock.
|
|
//
|
|
// must be acquired exclusively when entries are being added or deleted
|
|
// from the table, and when the states of entries are being changed.
|
|
//
|
|
// must be acquired non-exclusively on all other acceses.
|
|
//
|
|
|
|
typedef struct _NETWORK_ENTRY
|
|
{
|
|
// Lock
|
|
READ_WRITE_LOCK rwlLock;
|
|
|
|
PHASH_TABLE phtInterfaceTable; // primary access structure
|
|
LIST_ENTRY leIndexSortedList; // secondary access structure
|
|
} NETWORK_ENTRY, *PNETWORK_ENTRY;
|
|
|
|
|
|
|
|
DWORD
|
|
NE_Create (
|
|
OUT PNETWORK_ENTRY *ppneNetworkEntry);
|
|
|
|
DWORD
|
|
NE_Destroy (
|
|
IN PNETWORK_ENTRY pneNetworkEntry);
|
|
|
|
#ifdef DEBUG
|
|
DWORD
|
|
NE_Display (
|
|
IN PNETWORK_ENTRY pneNetworkEntry);
|
|
#else
|
|
#define NE_Display(pneNetworkEntry)
|
|
#endif // DEBUG
|
|
|
|
#endif // _NETWORKENTRY_H_
|