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