554 lines
12 KiB
C
554 lines
12 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
isnipx.h
|
||
|
||
Abstract:
|
||
|
||
This module contains definitions specific to the
|
||
IPX module of the ISN transport.
|
||
|
||
Author:
|
||
|
||
Adam Barr (adamba) 2-September-1993
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
#ifndef _ISNIPX_
|
||
#define _ISNIPX_
|
||
|
||
#define MAC_HEADER_SIZE ((IPX_MAXIMUM_MAC + 3) & ~3)
|
||
#define RIP_PACKET_SIZE ((sizeof(RIP_PACKET) + 3) & ~3)
|
||
#define IPX_HEADER_SIZE ((sizeof(IPX_HEADER) + 3) & ~3)
|
||
|
||
//
|
||
// Frame type definitions
|
||
//
|
||
|
||
#define ISN_FRAME_TYPE_ETHERNET_II 0
|
||
#define ISN_FRAME_TYPE_802_3 1
|
||
#define ISN_FRAME_TYPE_802_2 2
|
||
#define ISN_FRAME_TYPE_SNAP 3
|
||
#define ISN_FRAME_TYPE_ARCNET 4 // we ignore this
|
||
#define ISN_FRAME_TYPE_MAX 4 // of the four standard ones
|
||
|
||
#define ISN_FRAME_TYPE_AUTO 0xff
|
||
|
||
|
||
//
|
||
// This defines the size of the maximum MAC header required
|
||
// (token-ring: MAC 14 bytes, RI 18 bytes, LLC 3 bytes, SNAP 5 bytes).
|
||
//
|
||
|
||
#define IPX_MAXIMUM_MAC 40
|
||
|
||
//
|
||
// This is an internal identifier used for RIP query packets.
|
||
//
|
||
|
||
#define IDENTIFIER_RIP_INTERNAL 4
|
||
|
||
//
|
||
// This is an internal identifier used for RIP response packets.
|
||
//
|
||
|
||
#define IDENTIFIER_RIP_RESPONSE 5
|
||
|
||
|
||
//
|
||
// This is the total number of "real" identifiers.
|
||
//
|
||
|
||
#define IDENTIFIER_TOTAL 4
|
||
|
||
|
||
//
|
||
// Some definitions (in the correct on-the-wire order).
|
||
//
|
||
|
||
#define RIP_PACKET_TYPE 0x01
|
||
#define RIP_SOCKET 0x5304
|
||
#define RIP_REQUEST 0x0100
|
||
#define RIP_RESPONSE 0x0200
|
||
#define RIP_DOWN 0x8200 // use high bit to indicate it
|
||
|
||
#define SAP_PACKET_TYPE 0x04
|
||
#define SAP_SOCKET 0x5204
|
||
|
||
#define SPX_PACKET_TYPE 0x05
|
||
|
||
#define NB_SOCKET 0x5504
|
||
|
||
|
||
#include <packon.h>
|
||
|
||
//
|
||
// Definition of the IPX header.
|
||
//
|
||
|
||
typedef struct _IPX_HEADER {
|
||
USHORT CheckSum;
|
||
UCHAR PacketLength[2];
|
||
UCHAR TransportControl;
|
||
UCHAR PacketType;
|
||
UCHAR DestinationNetwork[4];
|
||
UCHAR DestinationNode[6];
|
||
USHORT DestinationSocket;
|
||
UCHAR SourceNetwork[4];
|
||
UCHAR SourceNode[6];
|
||
USHORT SourceSocket;
|
||
} IPX_HEADER, *PIPX_HEADER;
|
||
|
||
|
||
//
|
||
// Definition of a RIP network entry.
|
||
//
|
||
|
||
typedef struct _RIP_NETWORK_ENTRY {
|
||
ULONG NetworkNumber;
|
||
USHORT HopCount;
|
||
USHORT TickCount;
|
||
} RIP_NETWORK_ENTRY, *PRIP_NETWORK_ENTRY;
|
||
|
||
//
|
||
// Definition of a single entry rip packet.
|
||
//
|
||
|
||
typedef struct _RIP_PACKET {
|
||
USHORT Operation;
|
||
RIP_NETWORK_ENTRY NetworkEntry;
|
||
} RIP_PACKET, *PRIP_PACKET;
|
||
|
||
#include <packoff.h>
|
||
|
||
|
||
#define IPX_DEVICE_SIGNATURE 0x1401
|
||
#define IPX_ADAPTER_SIGNATURE 0x1402
|
||
#define IPX_BINDING_SIGNATURE 0x1403
|
||
#define IPX_ADDRESS_SIGNATURE 0x1404
|
||
#define IPX_ADDRESSFILE_SIGNATURE 0x1405
|
||
#define IPX_RT_SIGNATURE 0x1406
|
||
|
||
#define IPX_FILE_TYPE_CONTROL (ULONG)0x4701 // file is type control
|
||
|
||
|
||
//
|
||
// Defined granularity of RIP timeouts in milliseconds
|
||
//
|
||
|
||
#define RIP_GRANULARITY 55
|
||
|
||
|
||
//
|
||
// The default number of segments in the RIP table.
|
||
//
|
||
|
||
#define RIP_SEGMENTS 7
|
||
|
||
|
||
|
||
//
|
||
// Convert a ushort netware order <-> machine order
|
||
//
|
||
|
||
#define REORDER_USHORT(_Ushort) ((((_Ushort) & 0xff00) >> 8) | (((_Ushort) & 0x00ff) << 8))
|
||
|
||
//
|
||
// Convert a ulong netware order <-> machine order
|
||
//
|
||
|
||
#define REORDER_ULONG(_Ulong) \
|
||
((((_Ulong) & 0xff000000) >> 24) | \
|
||
(((_Ulong) & 0x00ff0000) >> 8) | \
|
||
(((_Ulong) & 0x0000ff00) << 8) | \
|
||
(((_Ulong) & 0x000000ff) << 24))
|
||
|
||
|
||
|
||
#if DBG
|
||
|
||
extern ULONG IpxDebug;
|
||
extern ULONG IpxMemoryDebug;
|
||
|
||
#define IPX_MEMORY_LOG_SIZE 128
|
||
extern UCHAR IpxDebugMemory[IPX_MEMORY_LOG_SIZE][192];
|
||
extern PUCHAR IpxDebugMemoryLoc;
|
||
extern PUCHAR IpxDebugMemoryEnd;
|
||
|
||
VOID
|
||
IpxDebugMemoryLog(
|
||
IN PUCHAR FormatString,
|
||
...
|
||
);
|
||
|
||
#define IPX_DEBUG(_Flag, _Print) { \
|
||
if (IpxDebug & (IPX_DEBUG_ ## _Flag)) { \
|
||
DbgPrint ("IPX: "); \
|
||
DbgPrint _Print; \
|
||
} \
|
||
if (IpxMemoryDebug & (IPX_DEBUG_ ## _Flag)) { \
|
||
IpxDebugMemoryLog _Print; \
|
||
} \
|
||
}
|
||
|
||
#else
|
||
|
||
#define IPX_DEBUG(_Flag, _Print)
|
||
|
||
#endif
|
||
|
||
|
||
//
|
||
// These definitions are for abstracting IRPs from the
|
||
// transport for portability.
|
||
//
|
||
|
||
#if ISN_NT
|
||
|
||
typedef IRP REQUEST, *PREQUEST;
|
||
|
||
|
||
//
|
||
// PREQUEST
|
||
// IpxAllocateRequest(
|
||
// IN PDEVICE Device,
|
||
// IN PIRP Irp
|
||
// );
|
||
//
|
||
// Allocates a request for the system-specific request structure.
|
||
//
|
||
|
||
#define IpxAllocateRequest(_Device,_Irp) \
|
||
(_Irp)
|
||
|
||
|
||
//
|
||
// BOOLEAN
|
||
// IF_NOT_ALLOCATED(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Checks if a request was not successfully allocated.
|
||
//
|
||
|
||
#define IF_NOT_ALLOCATED(_Request) \
|
||
if (0)
|
||
|
||
|
||
//
|
||
// VOID
|
||
// IpxFreeRequest(
|
||
// IN PDEVICE Device,
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Frees a previously allocated request.
|
||
//
|
||
|
||
#define IpxFreeRequest(_Device,_Request) \
|
||
;
|
||
|
||
|
||
//
|
||
// VOID
|
||
// MARK_REQUEST_PENDING(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Marks that a request will pend.
|
||
//
|
||
|
||
#define MARK_REQUEST_PENDING(_Request) \
|
||
IoMarkIrpPending(_Request)
|
||
|
||
|
||
//
|
||
// VOID
|
||
// UNMARK_REQUEST_PENDING(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Marks that a request will not pend.
|
||
//
|
||
|
||
#define UNMARK_REQUEST_PENDING(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->Control) &= ~SL_PENDING_RETURNED)
|
||
|
||
|
||
//
|
||
// UCHAR
|
||
// REQUEST_MAJOR_FUNCTION
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Returns the major function code of a request.
|
||
//
|
||
|
||
#define REQUEST_MAJOR_FUNCTION(_Request) \
|
||
((IoGetCurrentIrpStackLocation(_Request))->MajorFunction)
|
||
|
||
|
||
//
|
||
// UCHAR
|
||
// REQUEST_MINOR_FUNCTION
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Returns the minor function code of a request.
|
||
//
|
||
|
||
#define REQUEST_MINOR_FUNCTION(_Request) \
|
||
((IoGetCurrentIrpStackLocation(_Request))->MinorFunction)
|
||
|
||
|
||
//
|
||
// PNDIS_BUFFER
|
||
// REQUEST_NDIS_BUFFER
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Returns the NDIS buffer chain associated with a request.
|
||
//
|
||
|
||
#define REQUEST_NDIS_BUFFER(_Request) \
|
||
((PNDIS_BUFFER)((_Request)->MdlAddress))
|
||
|
||
|
||
//
|
||
// PVOID
|
||
// REQUEST_OPEN_CONTEXT(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Gets the context associated with an opened address/connection/control channel.
|
||
//
|
||
|
||
#define REQUEST_OPEN_CONTEXT(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->FileObject)->FsContext)
|
||
|
||
|
||
//
|
||
// PVOID
|
||
// REQUEST_OPEN_TYPE(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Gets the type associated with an opened address/connection/control channel.
|
||
//
|
||
|
||
#define REQUEST_OPEN_TYPE(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->FileObject)->FsContext2)
|
||
|
||
|
||
//
|
||
// PFILE_FULL_EA_INFORMATION
|
||
// OPEN_REQUEST_EA_INFORMATION(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Returns the EA information associated with an open/close request.
|
||
//
|
||
|
||
#define OPEN_REQUEST_EA_INFORMATION(_Request) \
|
||
((PFILE_FULL_EA_INFORMATION)((_Request)->AssociatedIrp.SystemBuffer))
|
||
|
||
|
||
#define OPEN_REQUEST_EA_LENGTH(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->Parameters.DeviceIoControl.InputBufferLength))
|
||
|
||
#define OPEN_REQUEST_RCV_LEN(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->Parameters.DeviceIoControl.OutputBufferLength))
|
||
|
||
#define REQUEST_SPECIAL_RECV(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->Parameters.DeviceIoControl.IoControlCode) == MIPX_RCV_DATAGRAM)
|
||
|
||
#define REQUEST_SPECIAL_SEND(_Request) \
|
||
(((IoGetCurrentIrpStackLocation(_Request))->Parameters.DeviceIoControl.IoControlCode) == MIPX_SEND_DATAGRAM)
|
||
|
||
|
||
#define REQUEST_CODE(_Request) \
|
||
((IoGetCurrentIrpStackLocation(_Request))->Parameters.DeviceIoControl.IoControlCode)
|
||
|
||
//
|
||
// The following value does not clash with TDI_TRANSPORT_ADDRESS_FILE value of
|
||
// 0x1
|
||
//
|
||
#define ROUTER_ADDRESS_FILE 0x4
|
||
|
||
//
|
||
// PTDI_REQUEST_KERNEL
|
||
// REQUEST_PARAMETERS(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Obtains a pointer to the parameters of a request.
|
||
//
|
||
|
||
#define REQUEST_PARAMETERS(_Request) \
|
||
(&((IoGetCurrentIrpStackLocation(_Request))->Parameters))
|
||
|
||
|
||
//
|
||
// VOID
|
||
// REQUEST_OPEN_CONTEXT_AND_PARAMS(
|
||
// IN PREQUEST Request
|
||
// OUT PVOID * OpenContext,
|
||
// OUT PTDI_REQUEST_KERNEL * Parameters
|
||
// );
|
||
//
|
||
// Simultaneously returns the open context and the parameters
|
||
// for a request (this is an optimization since the send
|
||
// datagram code needs them both).
|
||
//
|
||
|
||
#define REQUEST_OPEN_CONTEXT_AND_PARAMS(_Request,_OpenContext,_Parameters) { \
|
||
PIO_STACK_LOCATION _IrpSp = IoGetCurrentIrpStackLocation(_Request); \
|
||
*(_OpenContext) = _IrpSp->FileObject->FsContext; \
|
||
*(_Parameters) = (PTDI_REQUEST_KERNEL)(&_IrpSp->Parameters); \
|
||
}
|
||
|
||
|
||
//
|
||
// PLIST_ENTRY
|
||
// REQUEST_LINKAGE(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Returns a pointer to a linkage field in the request.
|
||
//
|
||
|
||
#define REQUEST_LINKAGE(_Request) \
|
||
(&((_Request)->Tail.Overlay.ListEntry))
|
||
|
||
|
||
//
|
||
// PREQUEST
|
||
// LIST_ENTRY_TO_REQUEST(
|
||
// IN PLIST_ENTRY ListEntry
|
||
// );
|
||
//
|
||
// Returns a request given a linkage field in it.
|
||
//
|
||
|
||
#define LIST_ENTRY_TO_REQUEST(_ListEntry) \
|
||
((PREQUEST)(CONTAINING_RECORD(_ListEntry, REQUEST, Tail.Overlay.ListEntry)))
|
||
|
||
|
||
//
|
||
// NTSTATUS
|
||
// REQUEST_STATUS(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Used to access the status field of a request.
|
||
//
|
||
|
||
#define REQUEST_STATUS(_Request) \
|
||
(_Request)->IoStatus.Status
|
||
|
||
|
||
//
|
||
// ULONG
|
||
// REQUEST_INFORMATION(
|
||
// IN PREQUEST Request)
|
||
// );
|
||
//
|
||
// Used to access the information field of a request.
|
||
//
|
||
|
||
#define REQUEST_INFORMATION(_Request) \
|
||
(_Request)->IoStatus.Information
|
||
|
||
|
||
//
|
||
// VOID
|
||
// IpxCompleteRequest(
|
||
// IN PREQUEST Request
|
||
// );
|
||
//
|
||
// Completes a request whose status and information fields have
|
||
// been filled in.
|
||
//
|
||
|
||
#define IpxCompleteRequest(_Request) \
|
||
IoCompleteRequest (_Request, IO_NETWORK_INCREMENT)
|
||
|
||
#else
|
||
|
||
//
|
||
// These routines must be defined for portability to a VxD.
|
||
//
|
||
|
||
#endif
|
||
|
||
|
||
#define IPX_INCREMENT(_Long, _Lock) InterlockedIncrement(_Long)
|
||
#define IPX_DECREMENT(_Long, _Lock) InterlockedDecrement(_Long)
|
||
|
||
#define IPX_ADD_ULONG(_Pulong, _Ulong, _Lock) InterlockedExchangeAdd(_Pulong, _Ulong)
|
||
|
||
#define IPX_DEFINE_SYNC_CONTEXT(_SyncContext)
|
||
#define IPX_BEGIN_SYNC(_SyncContext)
|
||
#define IPX_END_SYNC(_SyncContext)
|
||
|
||
#define IPX_DEFINE_LOCK_HANDLE(_LockHandle) CTELockHandle _LockHandle;
|
||
#define IPX_DEFINE_LOCK_HANDLE_PARAM(_LockHandle) CTELockHandle _LockHandle;
|
||
|
||
#define IPX_GET_LOCK(_Lock, _LockHandle) \
|
||
CTEGetLock(_Lock, _LockHandle)
|
||
|
||
#define IPX_FREE_LOCK(_Lock, _LockHandle) \
|
||
CTEFreeLock(_Lock, _LockHandle)
|
||
|
||
#define IPX_GET_LOCK1(_Lock, _LockHandle)
|
||
|
||
#define IPX_FREE_LOCK1(_Lock, _LockHandle)
|
||
|
||
#define IPX_REMOVE_HEAD_LIST(_Queue, _Lock) ExInterlockedRemoveHeadList(_Queue, _Lock)
|
||
#define IPX_LIST_WAS_EMPTY(_Queue, _OldHead) ((_OldHead) == NULL)
|
||
#define IPX_INSERT_HEAD_LIST(_Queue, _Entry, _Lock) ExInterlockedInsertHeadList(_Queue, _Entry, _Lock)
|
||
#define IPX_INSERT_TAIL_LIST(_Queue, _Entry, _Lock) ExInterlockedInsertTailList(_Queue, _Entry, _Lock)
|
||
|
||
#define IPX_POP_ENTRY_LIST(_Queue, _Lock) ExInterlockedPopEntrySList(_Queue, _Lock)
|
||
#define IPX_PUSH_ENTRY_LIST(_Queue, _Entry, _Lock) ExInterlockedPushEntrySList(_Queue, _Entry, _Lock)
|
||
|
||
//
|
||
// This macro adds a ULONG to a LARGE_INTEGER.
|
||
//
|
||
|
||
#define ADD_TO_LARGE_INTEGER(_LargeInteger,_Ulong) \
|
||
ExInterlockedAddLargeStatistic((_LargeInteger),(ULONG)(_Ulong))
|
||
|
||
#define IPX_DEBUG_DEVICE 0x00000001
|
||
#define IPX_DEBUG_ADAPTER 0x00000002
|
||
#define IPX_DEBUG_ADDRESS 0x00000004
|
||
#define IPX_DEBUG_SEND 0x00000008
|
||
#define IPX_DEBUG_NDIS 0x00000010
|
||
#define IPX_DEBUG_RECEIVE 0x00000020
|
||
#define IPX_DEBUG_CONFIG 0x00000040
|
||
#define IPX_DEBUG_PACKET 0x00000080
|
||
#define IPX_DEBUG_RIP 0x00000100
|
||
#define IPX_DEBUG_BIND 0x00000200
|
||
#define IPX_DEBUG_ACTION 0x00000400
|
||
#define IPX_DEBUG_BAD_PACKET 0x00000800
|
||
#define IPX_DEBUG_SOURCE_ROUTE 0x00001000
|
||
#define IPX_DEBUG_WAN 0x00002000
|
||
#define IPX_DEBUG_AUTO_DETECT 0x00004000
|
||
|
||
#define IPX_DEBUG_PNP 0x00008000
|
||
|
||
#define IPX_DEBUG_LOOPB 0x00010000
|
||
|
||
#define IPX_DEBUG_TEMP 0x00020000
|
||
#endif
|
||
|