|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
if.h
Abstract:
This file contains declarations for interface management.
Author:
Abolade Gbadegesin (t-abolag) 12-July-1997
Revision History:
--*/
#ifndef _NAT_IF_H_
#define _NAT_IF_H_
//
// Structure: NAT_ADDRESS
//
// This structure holds an address in an interface's list of binding-addresses.
//
typedef struct _NAT_ADDRESS { ULONG Address; ULONG Mask; ULONG NegatedClassMask; } NAT_ADDRESS, *PNAT_ADDRESS;
struct _NAT_INTERFACE;
//
// Structure: NAT_INTERFACE
//
// Holds configuration/operational information for a NAT interface.
//
// Synchronization on an interface makes use of an interface-list lock
// ('InterfaceLock'), a per-interface reference count, and a per-interface
// spin-lock:
//
// Acquiring a reference to an interface guarantees the interface's existence;
// acquiring the interface's spin-lock guarantees the interface's consistency.
//
// To acquire a reference, first acquire the interface-list lock;
// to traverse the interface-list, first acquire the interface-list lock.
//
// An interface's spin-lock can only be acquired if
// (a) a reference to the interface has been acquired, or
// (b) the interface-list lock is currently held.
// Note that holding the list lock alone does not guarantee consistency.
//
// Each session being associated with an interface is linked into its
// of mappings ('MappingList'). Access to this list of mappings must also
// be synchronized. This is achieved using 'InterfaceMappingLock', which
// must be acquired before modifying any interface's list of mappings.
// See 'MAPPING.H' for further details.
//
// N.B. On the rare occasions when 'MappingLock' must be held at the same time
// as one of 'InterfaceLock', 'EditorLock', and 'DirectorLock', 'MappingLock'
// must always be acquired first.
//
typedef struct _NAT_INTERFACE { LIST_ENTRY Link; ULONG ReferenceCount; KSPIN_LOCK Lock; ULONG Index; // read-only
PFILE_OBJECT FileObject; // read-only
//
// Configuration information
//
PIP_NAT_INTERFACE_INFO Info; ULONG Flags; ULONG AddressRangeCount; PIP_NAT_ADDRESS_RANGE AddressRangeArray; ULONG PortMappingCount; PIP_NAT_PORT_MAPPING PortMappingArray; ULONG AddressMappingCount; PIP_NAT_ADDRESS_MAPPING AddressMappingArray; ULONG IcmpFlags; USHORT MTU; //
// Binding information
//
ULONG AddressCount; // read-only
PNAT_ADDRESS AddressArray; // read-only
//
// Operational information
//
ULONG NoStaticMappingExists; // interlocked-access only
ULONG FreeMapCount; PNAT_FREE_ADDRESS FreeMapArray; PNAT_USED_ADDRESS UsedAddressTree; LIST_ENTRY UsedAddressList; LIST_ENTRY TicketList; LIST_ENTRY MappingList; //
// Statistical information
//
IP_NAT_INTERFACE_STATISTICS Statistics; } NAT_INTERFACE, *PNAT_INTERFACE;
//
// Flags
//
#define NAT_INTERFACE_BOUNDARY(Interface) \
((Interface)->Flags & IP_NAT_INTERFACE_FLAGS_BOUNDARY)
#define NAT_INTERFACE_NAPT(Interface) \
((Interface)->Flags & IP_NAT_INTERFACE_FLAGS_NAPT)
#define NAT_INTERFACE_FW(Interface) \
((Interface)->Flags & IP_NAT_INTERFACE_FLAGS_FW)
#define NAT_INTERFACE_FLAGS_DELETED 0x80000000
#define NAT_INTERFACE_DELETED(Interface) \
((Interface)->Flags & NAT_INTERFACE_FLAGS_DELETED)
#define NAT_INTERFACE_ALLOW_ICMP(Interface, MessageCode) \
((Interface)->IcmpFlags & (1 << MessageCode))
//
// Defines the depth of the lookaside list for allocating ICMP mappings
//
#define ICMP_LOOKASIDE_DEPTH 10
//
// Defines the depth of the lookaside list for allocating IP mappings
//
#define IP_LOOKASIDE_DEPTH 10
//
// Minimum interface MTU
//
#define MIN_VALID_MTU 68
//
// GLOBAL DATA DECLARATIONS
//
extern ULONG FirewalledInterfaceCount; extern CACHE_ENTRY InterfaceCache[CACHE_SIZE]; extern ULONG InterfaceCount; extern LIST_ENTRY InterfaceList; extern KSPIN_LOCK InterfaceLock; extern KSPIN_LOCK InterfaceMappingLock;
//
// INTERFACE MANAGEMENT ROUTINES
//
VOID NatCleanupInterface( IN PNAT_INTERFACE Interfacep );
NTSTATUS NatConfigureInterface( IN PIP_NAT_INTERFACE_INFO InterfaceInfo, IN PFILE_OBJECT FileObject );
NTSTATUS NatCreateInterface( IN PIP_NAT_CREATE_INTERFACE CreateInterface, IN PFILE_OBJECT FileObject );
VOID NatDeleteAnyAssociatedInterface( PFILE_OBJECT FileObject );
NTSTATUS NatDeleteInterface( IN ULONG Index, IN PFILE_OBJECT FileObject );
//
// BOOLEAN
// NatDereferenceInterface(
// PNAT_INTERFACE Interfacep
// );
//
#define \
NatDereferenceInterface( \ _Interfacep \ ) \ (InterlockedDecrement(&(_Interfacep)->ReferenceCount) \ ? TRUE \ : (NatCleanupInterface(_Interfacep), FALSE))
VOID NatInitializeInterfaceManagement( VOID );
PIP_NAT_ADDRESS_MAPPING NatLookupAddressMappingOnInterface( IN PNAT_INTERFACE Interfacep, IN ULONG PublicAddress );
//
// PNAT_INTERFACE
// NatLookupCachedInterface(
// IN ULONG Index,
// IN OUT PNAT_INTERFACE Interfacep
// );
//
#define \
NatLookupCachedInterface( \ _Index, \ _Interfacep \ ) \ ((((_Interfacep) = InterlockedProbeCache(InterfaceCache, (_Index))) && \ (_Interfacep)->Index == (_Index) && \ !NAT_INTERFACE_DELETED((_Interfacep))) \ ? (_Interfacep) \ : (((_Interfacep) = NatLookupInterface((_Index), NULL)) \ ? (InterlockedUpdateCache(InterfaceCache,(_Index),(_Interfacep)), \ (_Interfacep)) \ : NULL))
PNAT_INTERFACE NatLookupInterface( IN ULONG Index, OUT PLIST_ENTRY* InsertionPoint OPTIONAL );
PIP_NAT_PORT_MAPPING NatLookupPortMappingOnInterface( IN PNAT_INTERFACE Interfacep, IN UCHAR Protocol, IN USHORT PublicPort );
VOID NatMappingAttachInterface( PNAT_INTERFACE Interfacep, PVOID InterfaceContext, PNAT_DYNAMIC_MAPPING Mapping );
VOID NatMappingDetachInterface( PNAT_INTERFACE Interfacep, PVOID InterfaceContext, PNAT_DYNAMIC_MAPPING Mapping );
NTSTATUS NatQueryInformationInterface( IN ULONG Index, IN PIP_NAT_INTERFACE_INFO InterfaceInfo, IN PULONG Size );
NTSTATUS NatQueryStatisticsInterface( IN ULONG Index, IN PIP_NAT_INTERFACE_STATISTICS InterfaceStatistics );
//
// BOOLEAN
// NatReferenceInterface(
// PNAT_INTERFACE Interfacep
// );
//
#define \
NatReferenceInterface( \ _Interfacep \ ) \ (NAT_INTERFACE_DELETED(_Interfacep) \ ? FALSE \ : (InterlockedIncrement(&(_Interfacep)->ReferenceCount), TRUE))
VOID NatResetInterface( IN PNAT_INTERFACE Interfacep );
VOID NatShutdownInterfaceManagement( VOID );
#endif // _NAT_IF_H_
|