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

262 lines
6.1 KiB
C

/*++
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_