/*++ Copyright (c) 1997, Microsoft Corporation Module Name: nbt.h Abstract: This module contains declarations for the NAT's NetBT support. NetBT's datagram service embeds source IP address/port in the datagrams that it sends out, hence the need for additional translation. Author: Abolade Gbadegesin (t-abolag) 25-Aug-1997 Revision History: --*/ #ifndef _NAT_NBT_H_ #define _NAT_NBT_H_ // // Structure: NAT_NBT_MAPPING // // This structure describes a mapping defined to allow translation of // NetBT datagram-service sessions across the NAT. // // The NetBT datagram-service operates over UDP using port 138 for sending // and receiving messages. This means that regardless of what value the NAT // places in the NetBT datagram header, replies will be directed to port 138. // Therefore, in order to translate NetBT datagrams, the NAT must incorporate // additional information. // // The NAT registers a handler for outbound traffic destined for the NetBT // datagram-service port, as well as implementing an IP-layer translator // for inbound traffic destined for the NetBT datagram-service port. // Each outgoing message is then examined, and a mapping is created using // (a) the source (private) IP address in the datagram header // (b) the public IP address chosen by the NAT // (c) the source name in the datagram header // The source IP address is then replaced with the public IP address, // and the source port is replaced with the NetBT datagram-service port. // // Each incoming message is in turn examined by the IP-layer translator, // and a lookup is done using // (a) the receiving (public) IP address // (b) the destination name in the datagram header. // after which the packet's destination IP address is translated. // // A list of mappings is maintained on each interface, ordered by // by public IP address and source name for outbound searching. // typedef struct _NAT_NBT_MAPPING { LIST_ENTRY Link; ULONG PrivateAddress; ULONG PublicAddress; UCHAR SourceName[NBT_NAME_LENGTH]; LONG64 LastAccessTime; } NAT_NBT_MAPPING, *PNAT_NBT_MAPPING; // // NBT mapping allocation macros // #define ALLOCATE_NBT_BLOCK() \ ExAllocateFromNPagedLookasideList(&NbtLookasideList) #define FREE_NBT_BLOCK(Block) \ ExFreeToNPagedLookasideList(&NbtLookasideList,(Block)) // // FUNCTION DECLARATIONS // NTSTATUS NatCreateNbtMapping( PNAT_INTERFACE Interfacep, ULONG PrivateAddress, ULONG PublicAddress, UCHAR SourceName[], PLIST_ENTRY InboundInsertionPoint, PNAT_NBT_MAPPING* MappingCreated ); PNAT_NBT_MAPPING NatLookupInboundNbtMapping( PNAT_INTERFACE Interfacep, ULONG PublicAddress, UCHAR SourceName[], PLIST_ENTRY* InboundInsertionPoint ); NTSTATUS NatInitializeEditorNbt( VOID ); NTSTATUS NatOutboundDataHandlerNbt( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID RecvBuffer, IN ULONG DataOffset ); XLATE_IP_ROUTINE(NatTranslateNbt) extern IP_NAT_REGISTER_EDITOR NbtRegisterEditor; #endif // _NAT_NBT_H_