diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/tdi/isnp/inc/bind.h | 563 |
1 files changed, 563 insertions, 0 deletions
diff --git a/private/ntos/tdi/isnp/inc/bind.h b/private/ntos/tdi/isnp/inc/bind.h new file mode 100644 index 000000000..60294349d --- /dev/null +++ b/private/ntos/tdi/isnp/inc/bind.h @@ -0,0 +1,563 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + bind.h + +Abstract: + + Private include file for the ISN transport. It defines the + structures used for binding between IPX and the upper drivers. + +Author: + + Adam Barr (adamba) 04-Oct-1993 + +Revision History: + + Sanjay Anand (SanjayAn) 5-July-1995 + Bug fixes - tagged [SA] + +--*/ + +#ifndef _ISN_BIND_ +#define _ISN_BIND_ + +// +// Retrieve the common definitions. +// + +#include <isnkrnl.h> + + +// +// Define the IOCTL used for binding between the upper +// drivers and IPX. +// + +#define _IPX_CONTROL_CODE(request,method) \ + CTL_CODE(FILE_DEVICE_TRANSPORT, request, method, FILE_ANY_ACCESS) + +#define IOCTL_IPX_INTERNAL_BIND _IPX_CONTROL_CODE( 0x1234, METHOD_BUFFERED ) + + +// +// Identifier for the drivers in ISN. +// + +#define IDENTIFIER_NB 0 +#define IDENTIFIER_SPX 1 +#define IDENTIFIER_RIP 2 +#define IDENTIFIER_IPX 3 + +#ifdef _PNP_POWER +// +// This the number of PVOIDs in the beginning of the SEND_RESERVED +// section of a packet header, to be set aside by the ISN clients (NB/SPX) +// for IPX's private use. +// +#define SEND_RESERVED_COMMON_SIZE 8 +#endif + +// +// Definition of a RIP router table entry. +// + +typedef struct _IPX_ROUTE_ENTRY { + UCHAR Network[4]; + USHORT NicId; + UCHAR NextRouter[6]; + NDIS_HANDLE NdisBindingContext; + USHORT Flags; + USHORT Timer; + UINT Segment; + USHORT TickCount; + USHORT HopCount; + LIST_ENTRY AlternateRoute; + LIST_ENTRY NicLinkage; + struct { + LIST_ENTRY Linkage; + ULONG Reserved[1]; + } PRIVATE; +} IPX_ROUTE_ENTRY, * PIPX_ROUTE_ENTRY; + +// +// Definition of the Flags values. +// + +#define IPX_ROUTER_PERMANENT_ENTRY 0x0001 // entry should never be deleted +#define IPX_ROUTER_LOCAL_NET 0x0002 // locally attached network +#define IPX_ROUTER_SCHEDULE_ROUTE 0x0004 // call ScheduleRouteHandler after using +#define IPX_ROUTER_GLOBAL_WAN_NET 0x0008 // this is for rip's global network number + + +// +// Definition of the structure provided on a find +// route/find route completion call. +// + +// +// [SA] Bug #15094 added node number to the structure. +// + +typedef struct _IPX_FIND_ROUTE_REQUEST { + UCHAR Network[4]; + UCHAR Node[6] ; + IPX_LOCAL_TARGET LocalTarget; + UCHAR Identifier; + UCHAR Type; + UCHAR Reserved1[2]; + PVOID Reserved2; + LIST_ENTRY Linkage; +} IPX_FIND_ROUTE_REQUEST, *PIPX_FIND_ROUTE_REQUEST; + +// +// Definitions for the Type value. +// + +#define IPX_FIND_ROUTE_NO_RIP 1 // fail if net is not in database +#define IPX_FIND_ROUTE_RIP_IF_NEEDED 2 // return net if in database, otherwise RIP out +#define IPX_FIND_ROUTE_FORCE_RIP 3 // re-RIP even if net is in database + + +// +// Structure used when querying the line information +// for a specific NID ID. +// + +typedef struct _IPX_LINE_INFO { + UINT LinkSpeed; + UINT MaximumPacketSize; + UINT MaximumSendSize; + UINT MacOptions; +} IPX_LINE_INFO, *PIPX_LINE_INFO; + + + +// +// Functions provided by the upper driver. +// + +typedef VOID +(*IPX_INTERNAL_RECEIVE) ( + IN NDIS_HANDLE MacBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN PIPX_LOCAL_TARGET RemoteAddress, + IN ULONG MacOptions, + IN PUCHAR LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT LookaheadBufferOffset, + IN UINT PacketSize +); + +typedef VOID +(*IPX_INTERNAL_RECEIVE_COMPLETE) ( + IN USHORT NicId +); + +typedef VOID +(*IPX_INTERNAL_STATUS) ( + IN USHORT NicId, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferLength +); + +typedef VOID +(*IPX_INTERNAL_SEND_COMPLETE) ( + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status +); + +typedef VOID +(*IPX_INTERNAL_TRANSFER_DATA_COMPLETE) ( + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred +); + +typedef VOID +(*IPX_INTERNAL_FIND_ROUTE_COMPLETE) ( + IN PIPX_FIND_ROUTE_REQUEST FindRouteRequest, + IN BOOLEAN FoundRoute +); + +typedef VOID +(*IPX_INTERNAL_LINE_UP) ( + IN USHORT NicId, + IN PIPX_LINE_INFO LineInfo, + IN NDIS_MEDIUM DeviceType, + IN PVOID ConfigurationData +); + +typedef VOID +(*IPX_INTERNAL_LINE_DOWN) ( + IN USHORT NicId +); + +typedef VOID +(*IPX_INTERNAL_SCHEDULE_ROUTE) ( + IN PIPX_ROUTE_ENTRY RouteEntry +); + +#if defined(_PNP_POWER) + +// +// following opcodes are used when calling the +// above handler. +// +typedef enum _IPX_PNP_OPCODE { + IPX_PNP_ADD_DEVICE, // 0 - addition of the first adapter + IPX_PNP_DELETE_DEVICE, // 1 - deletion of the last adapter + IPX_PNP_TRANSLATE_DEVICE, // 2 - translate device resource + IPX_PNP_TRANSLATE_ADDRESS, // 3 - translate address resource + IPX_PNP_ADDRESS_CHANGE, // 4 - Adapter address or Reserved address changed + IPX_PNP_MAX_OPCODES, // 5 +} IPX_PNP_OPCODE, *PIPX_PNP_OPCODE; + +// +// PnP event notification handler. +// +typedef VOID +(*IPX_INTERNAL_PNP_NOTIFICATION) ( + IN IPX_PNP_OPCODE PnPOpcode, + IN OUT PVOID PnpData +); + +// +// Pointer to this structure is passed in PnPData portion of +// the above handler when the opcode is ADD_DEVICE or DELETE_DEVICE. +// +typedef struct _IPX_PNP_INFO { + ULONG NetworkAddress; + UCHAR NodeAddress[6]; + BOOLEAN NewReservedAddress; // where the above is a new reserved + // address for the Ipx clients. + BOOLEAN FirstORLastDevice; // is this a first card arrival or last card deletion. + IPX_LINE_INFO LineInfo; // New LineInfo. + NIC_HANDLE NicHandle; +} IPX_PNP_INFO, *PIPX_PNP_INFO; + +#endif _PNP_POWER + +// +// Input to the bind IOCTL +// + +typedef struct _IPX_INTERNAL_BIND_INPUT { + USHORT Version; + UCHAR Identifier; + BOOLEAN BroadcastEnable; + UINT LookaheadRequired; + UINT ProtocolOptions; + IPX_INTERNAL_RECEIVE ReceiveHandler; + IPX_INTERNAL_RECEIVE_COMPLETE ReceiveCompleteHandler; + IPX_INTERNAL_STATUS StatusHandler; + IPX_INTERNAL_SEND_COMPLETE SendCompleteHandler; + IPX_INTERNAL_TRANSFER_DATA_COMPLETE TransferDataCompleteHandler; + IPX_INTERNAL_FIND_ROUTE_COMPLETE FindRouteCompleteHandler; + IPX_INTERNAL_LINE_UP LineUpHandler; + IPX_INTERNAL_LINE_DOWN LineDownHandler; + IPX_INTERNAL_SCHEDULE_ROUTE ScheduleRouteHandler; +#if defined(_PNP_POWER) + IPX_INTERNAL_PNP_NOTIFICATION PnPHandler; +#endif _PNP_POWER + ULONG RipParameters; +} IPX_INTERNAL_BIND_INPUT, * PIPX_INTERNAL_BIND_INPUT; + +#if defined(_PNP_POWER) +#define ISN_VERSION 2 +#endif _PNP_POWER +// +// Bit mask values for RipParameters. +// + +#define IPX_RIP_PARAM_GLOBAL_NETWORK 0x00000001 // single network for all WANS + + + +// +// Functions provided by the lower driver. +// + +typedef NDIS_STATUS +(*IPX_INTERNAL_SEND) ( + IN PIPX_LOCAL_TARGET RemoteAddress, + IN PNDIS_PACKET Packet, + IN ULONG PacketLength, + IN ULONG IncludedHeaderLength +); + +typedef VOID +(*IPX_INTERNAL_FIND_ROUTE) ( + IN PIPX_FIND_ROUTE_REQUEST FindRouteRequest +); + +typedef NTSTATUS +(*IPX_INTERNAL_QUERY) ( + IN ULONG InternalQueryType, +#if defined(_PNP_POWER) + IN PNIC_HANDLE NicHandle OPTIONAL, +#else + IN USHORT NicId OPTIONAL, +#endif _PNP_POWER + IN OUT PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG BufferLengthNeeded OPTIONAL +); + +typedef VOID +(*IPX_INTERNAL_TRANSFER_DATA)( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred + ); + +// +// Definitions of the internal query types. In all cases +// STATUS_SUCCESS is returned if the request succeeds, and +// STATUS_BUFFER_TOO_SMALL is returned, and BufferLengthNeeded +// set if specified, if the buffer is too short. Other +// return codes are defined below. The routine never pends. +// + +// +// This is used to query the line info. NicId specifies which one +// to query. Buffer contains an IPX_LINE_INFO structure which is +// used to return the information. Other return values: +// +// STATUS_INVALID_PARAMETER - NicId is invalid. +// + +#define IPX_QUERY_LINE_INFO 1 + +// +// This is used to query the maximum NicId. NicId is unused. The +// Buffer contains a USHORT which is used to return the information. +// + +#define IPX_QUERY_MAXIMUM_NIC_ID 2 + +// +// This is used to determine if the IPX address specified was sent +// by our local machine. If the address is the source address of a +// received frame, NicId should be the ID that was indicated; otherwise +// it should be set to 0. Buffer holds a TDI_ADDRESS_IPX. This +// call returns STATUS_SUCCESS if the address is local, and +// STATUS_NO_SUCH_DEVICE if not. +// + +#define IPX_QUERY_IS_ADDRESS_LOCAL 3 + +// +// This is used to query the receive buffer space of a given NicId. +// Buffer contains a ULONG which is used to return the information. +// It returns STATUS_INVALID_PARAMETER if NicId is invalid. +// + +#define IPX_QUERY_RECEIVE_BUFFER_SPACE 4 + +// +// This is used to query the local IPX address of a given NicId. +// Buffer contains a TDI_ADDRESS_IPX structure (the Socket is +// returned as 0). If it is queried on net 0 it returns the +// virtual network if there is one, otherwise STATUS_INVALID_PARAMETER. +// It returns STATUS_INVALID_PARAMETER if NicId is invalid. +// + +#define IPX_QUERY_IPX_ADDRESS 5 + +// +// This is used to return the source routing information for +// a give remote address. NicId will be the NIC the packet was +// received from. The IPX_SOURCE_ROUTING_QUERY is contained +// in Buffer. Always returns STATUS_SUCCESS, although the +// SourceRoutingLength may be 0 for unknown remotes. +// +// The source routing is return in the direction it was received +// from the remote, not the direction used in replying. The +// MaximumSendSize includes the IPX header (as it does in +// IPX_LINE_INFO). +// + +#define IPX_QUERY_SOURCE_ROUTING 6 + +typedef struct _IPX_SOURCE_ROUTING_INFO { + USHORT Identifier; // input: the caller's IDENTIFIER_SPX, _NB, etc. + UCHAR RemoteAddress[6]; // input: the remote address + UCHAR SourceRouting[18]; // output: room for the maximum source route + USHORT SourceRoutingLength; // output: the valid length of source route + ULONG MaximumSendSize; // output: based on nic and source routing +} IPX_SOURCE_ROUTING_INFO, * PIPX_SOURCE_ROUTING_INFO; + +// +// This is used to query the maximum NicId over which outgoing type +// 20 packets should be sent. It will be less than or equal to +// the IPX_QUERY_MAXIMUM_NIC_ID value. What's excluded are down wan +// lines and dialin wan lines if DisableDialinNetbios bit 1 is set. +// + +#define IPX_QUERY_MAX_TYPE_20_NIC_ID 7 + +#if defined(_PNP_POWER) + +// +// This are used by NB to pass down these TDI queries which cannot +// be completed in NB. +// + +#define IPX_QUERY_DATA_LINK_ADDRESS 8 +#define IPX_QUERY_NETWORK_ADDRESS 9 + +#endif _PNP_POWER + +// +// Output of a non-RIP bind. +// + +typedef struct _IPX_INTERNAL_BIND_OUTPUT { + USHORT Version; + UCHAR Node[6]; + UCHAR Network[4]; + USHORT MacHeaderNeeded; + USHORT IncludedHeaderOffset; + IPX_LINE_INFO LineInfo; + IPX_INTERNAL_SEND SendHandler; + IPX_INTERNAL_FIND_ROUTE FindRouteHandler; + IPX_INTERNAL_QUERY QueryHandler; + IPX_INTERNAL_TRANSFER_DATA TransferDataHandler; +} IPX_INTERNAL_BIND_OUTPUT, * PIPX_INTERNAL_BIND_OUTPUT; + + + +// +// Lower driver functions provided only for RIP. +// + +typedef UINT +(*IPX_INTERNAL_GET_SEGMENT) ( + IN UCHAR Network[4] +); + +typedef PIPX_ROUTE_ENTRY +(*IPX_INTERNAL_GET_ROUTE) ( + IN UINT Segment, + IN UCHAR Network[4] +); + +typedef BOOLEAN +(*IPX_INTERNAL_ADD_ROUTE) ( + IN UINT Segment, + IN PIPX_ROUTE_ENTRY RouteEntry +); + +typedef BOOLEAN +(*IPX_INTERNAL_DELETE_ROUTE) ( + IN UINT Segment, + IN PIPX_ROUTE_ENTRY RouteEntry +); + +typedef PIPX_ROUTE_ENTRY +(*IPX_INTERNAL_GET_FIRST_ROUTE) ( + IN UINT Segment +); + +typedef PIPX_ROUTE_ENTRY +(*IPX_INTERNAL_GET_NEXT_ROUTE) ( + IN UINT Segment +); + +typedef VOID +(*IPX_INTERNAL_INCREMENT_WAN_INACTIVITY) ( +#ifdef _PNP_LATER + IN NIC_HANDLE NicHandle +#else + IN USHORT NicId +#endif +); + +typedef ULONG +(*IPX_INTERNAL_QUERY_WAN_INACTIVITY) ( +#ifdef _PNP_LATER + IN NIC_HANDLE NicHandle +#else + IN USHORT NicId +#endif + +); + +// +// Describes a single network. +// + +typedef struct _IPX_NIC_DATA { + USHORT NicId; + UCHAR Node[6]; + UCHAR Network[4]; + IPX_LINE_INFO LineInfo; + NDIS_MEDIUM DeviceType; + ULONG EnableWanRouter; +} IPX_NIC_DATA, * PIPX_NIC_DATA; + + +// +// Describes all networks. +// + +typedef struct _IPX_NIC_INFO_BUFFER { + USHORT NicCount; + USHORT VirtualNicId; + UCHAR VirtualNetwork[4]; + IPX_NIC_DATA NicData[1]; +} IPX_NIC_INFO_BUFFER, * PIPX_NIC_INFO_BUFFER; + + +// +// Output from a RIP bind (the actual structure size is +// based on the number of IPX_NIC_DATA elements in the +// final IPX_NIC_INFO_BUFFER structure). +// + +typedef struct _IPX_INTERNAL_BIND_RIP_OUTPUT { + USHORT Version; + USHORT MaximumNicCount; + USHORT MacHeaderNeeded; + USHORT IncludedHeaderOffset; + IPX_INTERNAL_SEND SendHandler; + UINT SegmentCount; + KSPIN_LOCK * SegmentLocks; + IPX_INTERNAL_GET_SEGMENT GetSegmentHandler; + IPX_INTERNAL_GET_ROUTE GetRouteHandler; + IPX_INTERNAL_ADD_ROUTE AddRouteHandler; + IPX_INTERNAL_DELETE_ROUTE DeleteRouteHandler; + IPX_INTERNAL_GET_FIRST_ROUTE GetFirstRouteHandler; + IPX_INTERNAL_GET_NEXT_ROUTE GetNextRouteHandler; + IPX_INTERNAL_INCREMENT_WAN_INACTIVITY IncrementWanInactivityHandler; + IPX_INTERNAL_QUERY_WAN_INACTIVITY QueryWanInactivityHandler; + IPX_INTERNAL_TRANSFER_DATA TransferDataHandler; + IPX_NIC_INFO_BUFFER NicInfoBuffer; +} IPX_INTERNAL_BIND_RIP_OUTPUT, * PIPX_INTERNAL_BIND_RIP_OUTPUT; + +#endif // _ISN_BIND_ + + +#ifndef _IPXCP_CONFIG_ +#define _IPXCP_CONFIG_ + +typedef struct _IPXCP_CONFIGURATION { + USHORT Version; + USHORT Length; + UCHAR Network[4]; + UCHAR LocalNode[6]; + UCHAR RemoteNode[6]; + ULONG ConnectionClient; // 0 - Server, 1 - Client +} IPXCP_CONFIGURATION, *PIPXCP_CONFIGURATION; + +#endif // _IPXCP_CONFIG_ + |