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_
|