windows-nt/Source/XPSP1/NT/net/rras/ip/nat/pool.h

219 lines
4.9 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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_