windows-nt/Source/XPSP1/NT/net/rras/ip/nat/icmp.h
2020-09-26 16:20:57 +08:00

135 lines
3 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
icmp.h
Abstract:
Contains declarations for the NAT's ICMP-message manipulation.
Author:
Abolade Gbadegesin (t-abolag) 30-July-1997
Revision History:
--*/
#ifndef _NAT_ICMP_H_
#define _NAT_ICMP_H_
//
// Structure: NAT_ICMP_MAPPING
//
// This structure stores a mapping created for an ICMP-request message.
//
// In order to allow ICMP requests to be associated with replies,
// we translate the 'Identification' field, which operates in a manner
// similar to the TCP/UDP port field; the 'Identification' field is the same
// for a 'session' (e.g. a series of echo-request messages).
//
// This means that when an internal machine 'pings' an external machine,
// we choose a unique 'PublicId' for the 'session' from the point of view
// of the external machine. Likewise, when an external machine 'pings'
// an internal machine, we choose a unique 'PrivateId' for the session.
//
// Hence, on the outbound path we identify ICMP messages using the tuple
//
// <RemoteAddress # PrivateAddress, PrivateId>
//
// and on the inbound path we identify using the tuple
//
// <RemoteAddress # PublicAddress, PublicId>
//
// and these tuples are the composite search keys for the outbound and inbound
// list of mappings, respectively, for each interface.
//
typedef struct _NAT_ICMP_MAPPING {
LIST_ENTRY Link[NatMaximumDirection];
ULONG64 PrivateKey;
ULONG64 PublicKey;
USHORT PrivateId;
USHORT PublicId;
LONG64 LastAccessTime;
} NAT_ICMP_MAPPING, *PNAT_ICMP_MAPPING;
//
// ICMP mapping-key manipulation macros
//
#define MAKE_ICMP_KEY(RemoteAddress,OtherAddress) \
((ULONG)(RemoteAddress) | ((ULONG64)((ULONG)(OtherAddress)) << 32))
#define ICMP_KEY_REMOTE(Key) ((ULONG)(Key))
#define ICMP_KEY_PRIVATE(Key) ((ULONG)((Key) >> 32))
#define ICMP_KEY_PUBLIC(Key) ((ULONG)((Key) >> 32))
//
// ICMP mapping allocation macros
//
#define ALLOCATE_ICMP_BLOCK() \
ExAllocateFromNPagedLookasideList(&IcmpLookasideList)
#define FREE_ICMP_BLOCK(Block) \
ExFreeToNPagedLookasideList(&IcmpLookasideList,(Block))
extern NPAGED_LOOKASIDE_LIST IcmpLookasideList;
extern LIST_ENTRY IcmpMappingList[NatMaximumDirection];
extern KSPIN_LOCK IcmpMappingLock;
//
// ICMP MAPPING MANAGEMENT ROUTINES
//
NTSTATUS
NatCreateIcmpMapping(
PNAT_INTERFACE Interfacep,
ULONG RemoteAddress,
ULONG PrivateAddress,
ULONG PublicAddress,
PUSHORT PrivateId,
PUSHORT PublicId,
PLIST_ENTRY InboundInsertionPoint,
PLIST_ENTRY OutboundInsertionPoint,
PNAT_ICMP_MAPPING* MappingCreated
);
VOID
NatInitializeIcmpManagement(
VOID
);
PNAT_ICMP_MAPPING
NatLookupInboundIcmpMapping(
ULONG64 PublicKey,
USHORT PublicId,
PLIST_ENTRY* InsertionPoint
);
PNAT_ICMP_MAPPING
NatLookupOutboundIcmpMapping(
ULONG64 PrivateKey,
USHORT PrivateId,
PLIST_ENTRY* InsertionPoint
);
VOID
NatShutdownIcmpManagement(
VOID
);
XLATE_IP_ROUTINE(NatTranslateIcmp)
#endif // _NAT_ICMP_H_