304 lines
6.7 KiB
C
304 lines
6.7 KiB
C
/*++
|
||
|
||
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_
|