219 lines
4.9 KiB
C
219 lines
4.9 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
pool.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This header contains declarations for the management of the NAT's pools
|
|||
|
of addresses and ports.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Abolade Gbadegesin (t-abolag) 12-July-1997
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _NAT_POOL_H_
|
|||
|
#define _NAT_POOL_H_
|
|||
|
|
|||
|
//
|
|||
|
// forward declaration
|
|||
|
//
|
|||
|
|
|||
|
struct _NAT_INTERFACE;
|
|||
|
#define PNAT_INTERFACE struct _NAT_INTERFACE*
|
|||
|
|
|||
|
//
|
|||
|
// Structure: NAT_FREE_ADDRESS
|
|||
|
//
|
|||
|
// Represents a range of free addresses
|
|||
|
// Each interface with address-ranges holds an array of this structure,
|
|||
|
// which keep track of which addresses are in use and which are free.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NAT_FREE_ADDRESS {
|
|||
|
|
|||
|
ULONG StartAddress;
|
|||
|
ULONG EndAddress;
|
|||
|
ULONG SubnetMask;
|
|||
|
PRTL_BITMAP Bitmap;
|
|||
|
|
|||
|
} NAT_FREE_ADDRESS, *PNAT_FREE_ADDRESS;
|
|||
|
|
|||
|
//
|
|||
|
// Structure: NAT_USED_ADDRESS
|
|||
|
//
|
|||
|
// Represents an address which is in use.
|
|||
|
//
|
|||
|
// Each address is an entry on its interface's list of in-use addresses
|
|||
|
// from the address pool. In addition to the address pool, entries are made
|
|||
|
// for each binding on the interface (i.e. each local address).
|
|||
|
//
|
|||
|
// Each address is also included in the interface's splay tree of addresses,
|
|||
|
// sorted on 'PrivateAddress'.
|
|||
|
//
|
|||
|
// Any address which is mapped statically to a private-address will have
|
|||
|
// the flag NAT_POOL_FLAG_STATIC set, and the field 'Mapping' will point
|
|||
|
// to the entry in the interface's configuration for the static address-mapping.
|
|||
|
//
|
|||
|
// When a session cannot be assigned a unique address, an in-use address
|
|||
|
// may be used for the session if the interface has port-translation enabled.
|
|||
|
// In this event, the field 'ReferenceCount' is incremented.
|
|||
|
//
|
|||
|
// Each in-use address is initialized with ranges for free UDP and TCP ports
|
|||
|
// (stored in network order). NextPortToTry is used to keep track of where
|
|||
|
// to start the search for an unconflicting port the next time an allocation
|
|||
|
// is requested; this is also in network order.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NAT_USED_ADDRESS {
|
|||
|
|
|||
|
RTL_SPLAY_LINKS SLink;
|
|||
|
LIST_ENTRY Link;
|
|||
|
ULONG64 Key;
|
|||
|
ULONG PrivateAddress;
|
|||
|
ULONG PublicAddress;
|
|||
|
struct _NAT_USED_ADDRESS* SharedAddress;
|
|||
|
PIP_NAT_ADDRESS_MAPPING AddressMapping;
|
|||
|
ULONG Flags;
|
|||
|
ULONG ReferenceCount;
|
|||
|
USHORT StartPort;
|
|||
|
USHORT EndPort;
|
|||
|
USHORT NextPortToTry;
|
|||
|
|
|||
|
} NAT_USED_ADDRESS, *PNAT_USED_ADDRESS;
|
|||
|
|
|||
|
#define MAKE_USED_ADDRESS_KEY(priv,pub) \
|
|||
|
((ULONG64)(((ULONG64)(priv) << 32) | (ULONG)(pub)))
|
|||
|
|
|||
|
//
|
|||
|
// Used-list entry is deleted
|
|||
|
//
|
|||
|
#define NAT_POOL_FLAG_DELETED 0x80000000
|
|||
|
#define NAT_POOL_DELETED(a) \
|
|||
|
((a)->Flags & NAT_POOL_FLAG_DELETED)
|
|||
|
|
|||
|
//
|
|||
|
// Used-list entry is for a static mapping
|
|||
|
//
|
|||
|
#define NAT_POOL_FLAG_STATIC 0x00000001
|
|||
|
#define NAT_POOL_STATIC(a) \
|
|||
|
((a)->Flags & NAT_POOL_FLAG_STATIC)
|
|||
|
|
|||
|
//
|
|||
|
// Used-list entry is for an interface's binding (i.e. local address)
|
|||
|
//
|
|||
|
#define NAT_POOL_FLAG_BINDING 0x00000008
|
|||
|
#define NAT_POOL_BINDING(a) \
|
|||
|
((a)->Flags & NAT_POOL_FLAG_BINDING)
|
|||
|
|
|||
|
//
|
|||
|
// Used-list entry is a placeholder for a shared address
|
|||
|
//
|
|||
|
#define NAT_POOL_FLAG_PLACEHOLDER 0x00000010
|
|||
|
#define NAT_POOL_PLACEHOLDER(a) \
|
|||
|
((a)->Flags & NAT_POOL_FLAG_PLACEHOLDER)
|
|||
|
|
|||
|
//
|
|||
|
// Macro for obtaining a placeholder's shared-address
|
|||
|
//
|
|||
|
|
|||
|
#define PLACEHOLDER_TO_ADDRESS(a) \
|
|||
|
((a) = NAT_POOL_PLACEHOLDER(a) ? (a)->SharedAddress : (a))
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// POOL MANAGEMENT ROUTINES
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatAcquireEndpointFromAddressPool(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
ULONG64 PrivateKey,
|
|||
|
ULONG64 RemoteKey,
|
|||
|
ULONG PublicAddress,
|
|||
|
USHORT PreferredPort,
|
|||
|
BOOLEAN AllowAnyPort,
|
|||
|
PNAT_USED_ADDRESS* AddressAcquired,
|
|||
|
PUSHORT PortAcquired
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatAcquireFromAddressPool(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
ULONG PrivateAddress,
|
|||
|
ULONG PublicAddress OPTIONAL,
|
|||
|
PNAT_USED_ADDRESS* AddressAcquired
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatAcquireFromPortPool(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
PNAT_USED_ADDRESS Addressp,
|
|||
|
UCHAR Protocol,
|
|||
|
USHORT PreferredPort,
|
|||
|
PUSHORT PortAcquired
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatCreateAddressPool(
|
|||
|
PNAT_INTERFACE Interfacep
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatCreateStaticPortMapping(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
PIP_NAT_PORT_MAPPING PortMapping
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatDeleteAddressPool(
|
|||
|
PNAT_INTERFACE Interfacep
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NatDereferenceAddressPoolEntry(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
PNAT_USED_ADDRESS AddressToRelease
|
|||
|
);
|
|||
|
|
|||
|
PNAT_USED_ADDRESS
|
|||
|
NatLookupAddressPoolEntry(
|
|||
|
PNAT_USED_ADDRESS Root,
|
|||
|
ULONG PrivateAddress,
|
|||
|
ULONG PublicAddress,
|
|||
|
PNAT_USED_ADDRESS* InsertionPoint
|
|||
|
);
|
|||
|
|
|||
|
PNAT_USED_ADDRESS
|
|||
|
NatLookupStaticAddressPoolEntry(
|
|||
|
PNAT_INTERFACE Interfacep,
|
|||
|
ULONG PublicAddress,
|
|||
|
BOOLEAN RequireInboundSessions
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// VOID
|
|||
|
// NatReferenceAddressPoolEntry(
|
|||
|
// PNAT_USED_ADDRESS Addressp
|
|||
|
// );
|
|||
|
//
|
|||
|
|
|||
|
#define \
|
|||
|
NatReferenceAddressPoolEntry( \
|
|||
|
_Addressp \
|
|||
|
) \
|
|||
|
(NAT_INTERFACE_DELETED(_Addressp) \
|
|||
|
? FALSE \
|
|||
|
: (InterlockedIncrement(&(_Addressp)->ReferenceCount), TRUE))
|
|||
|
|
|||
|
#undef PNAT_INTERFACE
|
|||
|
|
|||
|
#endif // _NAT_POOL_H_
|