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.
261 lines
5.8 KiB
261 lines
5.8 KiB
/*++
|
|
|
|
Copyright (c) 1997, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ticket.h
|
|
|
|
Abstract:
|
|
|
|
This module contains declarations for the NAT's ticket-management.
|
|
|
|
A NAT ticket is a dynamically-created token which allows any external
|
|
endpoint to establish a session to an internal endpoint using an allocated
|
|
public address/port pair. For instance, a streaming protocol might create
|
|
a ticket for a dynamically-negotiated secondary session to be established.
|
|
|
|
Author:
|
|
|
|
Abolade Gbadegesin (t-abolag) 21-Aug-1997
|
|
|
|
Revision History:
|
|
|
|
Abolade Gbadegesin (aboladeg) 16-Apr-1998
|
|
|
|
Allow wildcard tickets to be created by specifying zero for a field.
|
|
'NatLookupAndRemoveTicket' may be used to retrieve such tickets.
|
|
|
|
Abolade Gbadegesin (aboladeg) 17-Oct-1998
|
|
|
|
Eliminated wildcard ticket support. Created dynamic ticket support.
|
|
(See 'NAT_DYNAMIC_TICKET' below.)
|
|
|
|
--*/
|
|
|
|
#ifndef _NAT_TICKET_H_
|
|
#define _NAT_TICKET_H_
|
|
|
|
|
|
//
|
|
// Structure: NAT_TICKET
|
|
//
|
|
// This structure holds all the information we need about a ticket.
|
|
// Each instance is linked into a sorted per-interface list of tickets
|
|
// which is protected by the interface's lock.
|
|
//
|
|
|
|
typedef struct _NAT_TICKET {
|
|
LIST_ENTRY Link;
|
|
ULONG64 Key;
|
|
ULONG64 RemoteKey;
|
|
PNAT_USED_ADDRESS UsedAddress;
|
|
ULONG PrivateAddress;
|
|
USHORT PrivateOrHostOrderEndPort;
|
|
ULONG Flags;
|
|
LONG64 LastAccessTime;
|
|
} NAT_TICKET, *PNAT_TICKET;
|
|
|
|
//
|
|
// Structure: NAT_DYNAMIC_TICKET
|
|
//
|
|
// This structure holds the description of a dynamic ticket.
|
|
// Such a ticket is created so that when an outbound session is translated
|
|
// with a given destination port, a ticket can be created for a corresponding
|
|
// inbound session to a predetermined port, or to one of a range of ports.
|
|
//
|
|
|
|
typedef struct _NAT_DYNAMIC_TICKET {
|
|
LIST_ENTRY Link;
|
|
ULONG Key;
|
|
ULONG ResponseCount;
|
|
struct {
|
|
UCHAR Protocol;
|
|
USHORT StartPort;
|
|
USHORT EndPort;
|
|
}* ResponseArray;
|
|
PFILE_OBJECT FileObject;
|
|
} NAT_DYNAMIC_TICKET, *PNAT_DYNAMIC_TICKET;
|
|
|
|
//
|
|
// Ticket flags
|
|
//
|
|
|
|
#define NAT_TICKET_FLAG_PERSISTENT 0x00000001
|
|
#define NAT_TICKET_PERSISTENT(t) \
|
|
((t)->Flags & NAT_TICKET_FLAG_PERSISTENT)
|
|
|
|
#define NAT_TICKET_FLAG_PORT_MAPPING 0x00000002
|
|
#define NAT_TICKET_PORT_MAPPING(t) \
|
|
((t)->Flags & NAT_TICKET_FLAG_PORT_MAPPING)
|
|
|
|
#define NAT_TICKET_FLAG_IS_RANGE 0x00000004
|
|
#define NAT_TICKET_IS_RANGE(t) \
|
|
((t)->Flags & NAT_TICKET_FLAG_IS_RANGE)
|
|
|
|
//
|
|
// Ticket-key manipulation macros
|
|
//
|
|
|
|
#define MAKE_TICKET_KEY(Protocol,Address,Port) \
|
|
((Address) | \
|
|
((ULONG64)((Port) & 0xFFFF) << 32) | \
|
|
((ULONG64)((Protocol) & 0xFF) << 48))
|
|
|
|
#define TICKET_PROTOCOL(Key) ((UCHAR)(((Key) >> 48) & 0xFF))
|
|
#define TICKET_PORT(Key) ((USHORT)(((Key) >> 32) & 0xFFFF))
|
|
#define TICKET_ADDRESS(Key) ((ULONG)(Key))
|
|
|
|
#define MAKE_DYNAMIC_TICKET_KEY(Protocol, Port) \
|
|
((ULONG)((Port) & 0xFFFF) | ((ULONG)((Protocol) & 0xFF) << 16))
|
|
|
|
#define DYNAMIC_TICKET_PROTOCOL(Key) ((UCHAR)(((Key) >> 16) & 0xFF))
|
|
#define DYNAMIC_TICKET_PORT(Key) ((USHORT)((Key) & 0xFFFF))
|
|
|
|
//
|
|
// Ticket allocation macros
|
|
//
|
|
|
|
#define ALLOCATE_TICKET_BLOCK() \
|
|
(PNAT_TICKET)ExAllocatePoolWithTag( \
|
|
NonPagedPool,sizeof(NAT_TICKET), NAT_TAG_TICKET \
|
|
)
|
|
|
|
#define FREE_TICKET_BLOCK(Block) \
|
|
ExFreePool(Block)
|
|
|
|
//
|
|
// GLOBAL DATA DECLARATIONS
|
|
//
|
|
|
|
ULONG DynamicTicketCount;
|
|
ULONG TicketCount;
|
|
|
|
|
|
//
|
|
// TICKET MANAGEMENT ROUTINES
|
|
//
|
|
|
|
NTSTATUS
|
|
NatCreateDynamicTicket(
|
|
PIP_NAT_CREATE_DYNAMIC_TICKET CreateTicket,
|
|
ULONG InputBufferLength,
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NatCreateTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
UCHAR Protocol,
|
|
ULONG PrivateAddress,
|
|
USHORT PrivatePort,
|
|
ULONG RemoteAddress OPTIONAL,
|
|
ULONG RemotePort OPTIONAL,
|
|
ULONG Flags,
|
|
PNAT_USED_ADDRESS AddressToUse OPTIONAL,
|
|
USHORT PortToUse OPTIONAL,
|
|
PULONG PublicAddress,
|
|
PUSHORT PublicPort
|
|
);
|
|
|
|
VOID
|
|
NatDeleteAnyAssociatedDynamicTicket(
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NatDeleteDynamicTicket(
|
|
PIP_NAT_DELETE_DYNAMIC_TICKET DeleteTicket,
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
VOID
|
|
NatDeleteTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
PNAT_TICKET Ticketp
|
|
);
|
|
|
|
VOID
|
|
NatInitializeDynamicTicketManagement(
|
|
VOID
|
|
);
|
|
|
|
BOOLEAN
|
|
NatIsPortUsedByTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
UCHAR Protocol,
|
|
USHORT PublicPort
|
|
);
|
|
|
|
VOID
|
|
NatLookupAndApplyDynamicTicket(
|
|
UCHAR Protocol,
|
|
USHORT DestinationPort,
|
|
PNAT_INTERFACE Interfacep,
|
|
ULONG PublicAddress,
|
|
ULONG PrivateAddress
|
|
);
|
|
|
|
NTSTATUS
|
|
NatLookupAndDeleteTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
ULONG64 Key,
|
|
ULONG64 RemoteKey
|
|
);
|
|
|
|
NTSTATUS
|
|
NatLookupAndRemoveTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
ULONG64 Key,
|
|
ULONG64 RemoteKey,
|
|
PNAT_USED_ADDRESS* UsedAddress,
|
|
PULONG PrivateAddress,
|
|
PUSHORT PrivatePort
|
|
);
|
|
|
|
PNAT_TICKET
|
|
NatLookupFirewallTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
UCHAR Protocol,
|
|
USHORT Port
|
|
);
|
|
|
|
PNAT_TICKET
|
|
NatLookupTicket(
|
|
PNAT_INTERFACE Interfacep,
|
|
ULONG64 Key,
|
|
ULONG64 RemoteKey,
|
|
PLIST_ENTRY* InsertionPoint
|
|
);
|
|
|
|
PNAT_DYNAMIC_TICKET
|
|
NatLookupDynamicTicket(
|
|
ULONG Key,
|
|
PLIST_ENTRY* InsertionPoint
|
|
);
|
|
|
|
NTSTATUS
|
|
NatProcessCreateTicket(
|
|
PIP_NAT_CREATE_TICKET CreateTicket,
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NatProcessDeleteTicket(
|
|
PIP_NAT_CREATE_TICKET DeleteTicket,
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
NTSTATUS
|
|
NatProcessLookupTicket(
|
|
PIP_NAT_CREATE_TICKET LookupTicket,
|
|
PIP_NAT_PORT_MAPPING Ticket,
|
|
PFILE_OBJECT FileObject
|
|
);
|
|
|
|
VOID
|
|
NatShutdownDynamicTicketManagement(
|
|
VOID
|
|
);
|
|
|
|
#endif // _NAT_TICKET_H_
|