Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

217 lines
4.9 KiB

/*++
Module Name:
director.h
Abstract:
This module contains declarations for the NAT's director-handling.
Directors are consulted about the routing of incoming sessions.
Author:
Abolade Gbadegesin (aboladeg) 16-Feb-1998
Revision History:
Abolade Gbadegesin (aboladeg) 19-Apr-1998
Added support for wildcards in protocol/port of a director registration.
--*/
#ifndef _NAT_DIRECTOR_H_
#define _NAT_DIRECTOR_H_
//
// Structure: NAT_DIRECTOR
//
// Holds information about a director
//
// Each director is on a global list ('DirectorList') which is protected
// by a spin lock ('DirectorLock'). The list is sorted on a key composed of
// the protocol of the sessions to be edited and the protocol port number.
//
// N.B. The list is sorted in **descending** order. We allow wildcard
// registrations (e.g. port 0 means any port) so when searching for a director,
// using descending order allows us to find more specific matches before
// less-specific matches. The composition of the keys is critical in making
// this work; the protocol is in the most-significant part of the key,
// and the port is in the less-significant part.
//
// Access to directors is synchronized using the same reference-counting logic
// used to synchronize access to interfaces. See 'IF.H' for more information.
//
// Each session being directed by a director is linked into the director's list
// of mappings ('MappingList'). Access to this list of mappings must also
// be synchronized. This is achieved using 'DirectorMappingLock', which
// must be acquired before modifying any director'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. Again, see 'MAPPING.H' for further details.
//
typedef struct _NAT_DIRECTOR {
LIST_ENTRY Link;
ULONG Key;
ULONG ReferenceCount;
KSPIN_LOCK Lock;
LIST_ENTRY MappingList;
ULONG Flags;
PVOID Context; // read-only
PNAT_DIRECTOR_QUERY_SESSION QueryHandler; // read-only
PNAT_DIRECTOR_CREATE_SESSION CreateHandler; // read-only
PNAT_DIRECTOR_DELETE_SESSION DeleteHandler; // read-only
PNAT_DIRECTOR_UNLOAD UnloadHandler; // read-only
} NAT_DIRECTOR, *PNAT_DIRECTOR;
//
// Definitions of flags for the field NAT_DIRECTOR.Flags
//
#define NAT_DIRECTOR_FLAG_DELETED 0x80000000
#define NAT_DIRECTOR_DELETED(Director) \
((Director)->Flags & NAT_DIRECTOR_FLAG_DELETED)
//
// Director key-manipulation macros
//
#define MAKE_DIRECTOR_KEY(Protocol,Port) \
(((ULONG)((Protocol) & 0xFF) << 16) | \
(ULONG)((Port) & 0xFFFF))
#define DIRECTOR_KEY_PORT(Key) ((USHORT)((Key) & 0x0000FFFF))
#define DIRECTOR_KEY_PROTOCOL(Key) ((UCHAR)((Key) >> 16))
//
// GLOBAL DATA DECLARATIONS
//
extern ULONG DirectorCount;
extern LIST_ENTRY DirectorList;
extern KSPIN_LOCK DirectorLock;
extern KSPIN_LOCK DirectorMappingLock;
//
// DIRECTOR MANAGEMENT ROUTINES
//
VOID
NatCleanupDirector(
PNAT_DIRECTOR Director
);
NTSTATUS
NatCreateDirector(
PIP_NAT_REGISTER_DIRECTOR RegisterContext
);
NTSTATUS
NatDeleteDirector(
PNAT_DIRECTOR Director
);
//
// BOOLEAN
// NatDereferenceDirector(
// PNAT_DIRECTOR Director
// );
//
#define \
NatDereferenceDirector( \
_Director \
) \
(InterlockedDecrement(&(_Director)->ReferenceCount) \
? TRUE \
: NatCleanupDirector(_Director), FALSE)
VOID
NatInitializeDirectorManagement(
VOID
);
PNAT_DIRECTOR
NatLookupAndReferenceDirector(
UCHAR Protocol,
USHORT Port
);
PNAT_DIRECTOR
NatLookupDirector(
ULONG Key,
PLIST_ENTRY* InsertionPoint
);
struct _NAT_DYNAMIC_MAPPING;
VOID
NatMappingAttachDirector(
PNAT_DIRECTOR Director,
PVOID DirectorSessionContext,
struct _NAT_DYNAMIC_MAPPING* Mapping
);
VOID
NatMappingDetachDirector(
PNAT_DIRECTOR Director,
PVOID DirectorSessionContext,
struct _NAT_DYNAMIC_MAPPING* Mapping,
IP_NAT_DELETE_REASON DeleteReason
);
NTSTATUS
NatQueryDirectorTable(
IN PIP_NAT_ENUMERATE_DIRECTORS InputBuffer,
IN PIP_NAT_ENUMERATE_DIRECTORS OutputBuffer,
IN PULONG OutputBufferLength
);
//
// BOOLEAN
// NatReferenceDirector(
// PNAT_DIRECTOR Director
// );
//
#define \
NatReferenceDirector( \
_Director \
) \
(NAT_DIRECTOR_DELETED(_Director) \
? FALSE \
: InterlockedIncrement(&(_Director)->ReferenceCount), TRUE)
VOID
NatShutdownDirectorManagement(
VOID
);
//
// HELPER ROUTINES
//
NTSTATUS
NatDirectorDeregister(
IN PVOID DirectorHandle
);
NTSTATUS
NatDirectorDissociateSession(
IN PVOID EditorHandle,
IN PVOID SessionHandle
);
VOID
NatDirectorQueryInfoSession(
IN PVOID SessionHandle,
OUT PIP_NAT_SESSION_MAPPING_STATISTICS Statistics OPTIONAL
);
#endif // _NAT_DIRECTOR_H_