Leaked source code of windows server 2003
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.
 
 
 
 
 
 

303 lines
7.0 KiB

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