Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

966 lines
26 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
atkndis.h
Abstract:
This module contains the ndis init/deint and protocol-support
for ndis definitions.
Author:
Jameel Hyder ([email protected])
Nikhil Kamkolkar ([email protected])
Revision History:
19 Jun 1992 Initial Version
Notes: Tab stop: 4
--*/
#ifndef _ATKNDIS_
#define _ATKNDIS_
// This is the name that will be used in NdisRegisterProtocol. This has to match the
// registry section for PnP to work !!!
#define PROTOCOL_REGISTER_NAME L"Appletalk"
// NDIS Version (4.0)
#define PROTOCOL_MAJORNDIS_VERSION 4
#define PROTOCOL_MINORNDIS_VERSION 0
// IEEE802.2 Definitions
// Offsets within the Extended 802.2 header:
#define IEEE8022_DSAP_OFFSET 0
#define IEEE8022_SSAP_OFFSET 1
#define IEEE8022_CONTROL_OFFSET 2
#define IEEE8022_PROTO_OFFSET 3
// 808.2 header length: DSAP, SSAP, UI, and PID (protocol ID).
#define IEEE8022_HDR_LEN 8
// Values for SSAP and DSAP (the SNAP SAP) indicating 802.2 Extended.
#define SNAP_SAP ((BYTE)0xAA)
#define SNAP_SAP_FINAL ((BYTE)0xAB)
// Value for Control Field:
#define UNNUMBERED_INFO 0x03
#define UNNUMBERED_FORMAT 0xF3
// Length of 802.2 SNAP protocol discriminators.
#define IEEE8022_PROTO_TYPE_LEN 5
// The MAX_OPTHDR_LEN should be such that it holds the maximum header following
// the ddp header from the upper layers (ADSP 13/ATP 8) and also it should allow a
// full aarp packet to be held in the buffer when including the DDP header buffer.
// i.e. 28. Ddp long header is 13. So the max works out to 15.
#define MAX_OPTHDR_LEN 15
// AARP hardware types:
#define AARP_ELAP_HW_TYPE 1
#define AARP_TLAP_HW_TYPE 2
// Packet sizes.
#define AARP_MAX_DATA_SIZE 38 // Var fields... Enet is max
#define AARP_MIN_DATA_SIZE 28
#define AARP_MAX_PKT_SIZE (IEEE8022_HDR_LEN + AARP_MAX_DATA_SIZE)
#define AARPLINK_MAX_PKT_SIZE AARP_MAX_PKT_SIZE
#define AARP_ATALK_PROTO_TYPE 0x809B
#define NUM_PACKET_DESCRIPTORS 750
#define NUM_BUFFER_DESCRIPTORS 1000
#define ROUTING_FACTOR 4
// ETHERNET
#define ELAP_MIN_PKT_LEN 60
#define ELAP_ADDR_LEN 6
#define ELAP_DEST_OFFSET 0
#define ELAP_SRC_OFFSET 6
#define ELAP_LEN_OFFSET 12
#define ELAP_8022_START_OFFSET 14
#define ELAP_LINKHDR_LEN 14
// Ethernet multicast address:
#define ELAP_BROADCAST_ADDR_INIT \
{ 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF }
#define ELAP_ZONE_MULTICAST_ADDRS 253
#define ELAP_NUM_INIT_AARP_BUFFERS 10
// Values that are global to ndis routines
// These are the media the stack will support
GLOBAL NDIS_MEDIUM AtalkSupportedMedia[] EQU \
{ \
NdisMedium802_3, \
NdisMediumFddi, \
NdisMedium802_5, \
NdisMediumLocalTalk \
};
GLOBAL ULONG AtalkSupportedMediaSize EQU \
sizeof(AtalkSupportedMedia)/sizeof(NDIS_MEDIUM);
// Handle returned by RegisterProtocol
GLOBAL NDIS_HANDLE AtalkNdisProtocolHandle EQU NULL;
GLOBAL BYTE AtalkElapBroadcastAddr[ELAP_ADDR_LEN] EQU \
ELAP_BROADCAST_ADDR_INIT;
GLOBAL BYTE AtalkAlapBroadcastAddr[] EQU {0xFF};
GLOBAL BYTE AtalkAarpProtocolType[IEEE8022_PROTO_TYPE_LEN] EQU \
{ 0x00, \
0x00, \
0x00, \
0x80, \
0xF3 \
};
GLOBAL BYTE AtalkAppletalkProtocolType[IEEE8022_PROTO_TYPE_LEN] EQU \
{ 0x08, \
0x00, \
0x07, \
0x80, \
0x9B \
};
GLOBAL ATALK_NETWORKRANGE AtalkStartupNetworkRange EQU \
{ \
FIRST_STARTUP_NETWORK, \
LAST_STARTUP_NETWORK \
};
#define ELAP_MCAST_HDR_LEN (ELAP_ADDR_LEN - 1)
GLOBAL BYTE AtalkEthernetZoneMulticastAddrsHdr[ELAP_MCAST_HDR_LEN] EQU \
{ 0x09, 0x00, 0x07, 0x00, 0x00 };
GLOBAL BYTE AtalkEthernetZoneMulticastAddrs[ELAP_ZONE_MULTICAST_ADDRS] EQU \
{ \
0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , \
0x08 , 0x09 , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F , \
0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 , \
0x18 , 0x19 , 0x1A , 0x1B , 0x1C , 0x1D , 0x1E , 0x1F , \
0x20 , 0x21 , 0x22 , 0x23 , 0x24 , 0x25 , 0x26 , 0x27 , \
0x28 , 0x29 , 0x2A , 0x2B , 0x2C , 0x2D , 0x2E , 0x2F , \
0x30 , 0x31 , 0x32 , 0x33 , 0x34 , 0x35 , 0x36 , 0x37 , \
0x38 , 0x39 , 0x3A , 0x3B , 0x3C , 0x3D , 0x3E , 0x3F , \
0x40 , 0x41 , 0x42 , 0x43 , 0x44 , 0x45 , 0x46 , 0x47 , \
0x48 , 0x49 , 0x4A , 0x4B , 0x4C , 0x4D , 0x4E , 0x4F , \
0x50 , 0x51 , 0x52 , 0x53 , 0x54 , 0x55 , 0x56 , 0x57 , \
0x58 , 0x59 , 0x5A , 0x5B , 0x5C , 0x5D , 0x5E , 0x5F , \
0x60 , 0x61 , 0x62 , 0x63 , 0x64 , 0x65 , 0x66 , 0x67 , \
0x68 , 0x69 , 0x6A , 0x6B , 0x6C , 0x6D , 0x6E , 0x6F , \
0x70 , 0x71 , 0x72 , 0x73 , 0x74 , 0x75 , 0x76 , 0x77 , \
0x78 , 0x79 , 0x7A , 0x7B , 0x7C , 0x7D , 0x7E , 0x7F , \
0x80 , 0x81 , 0x82 , 0x83 , 0x84 , 0x85 , 0x86 , 0x87 , \
0x88 , 0x89 , 0x8A , 0x8B , 0x8C , 0x8D , 0x8E , 0x8F , \
0x90 , 0x91 , 0x92 , 0x93 , 0x94 , 0x95 , 0x96 , 0x97 , \
0x98 , 0x99 , 0x9A , 0x9B , 0x9C , 0x9D , 0x9E , 0x9F , \
0xA0 , 0xA1 , 0xA2 , 0xA3 , 0xA4 , 0xA5 , 0xA6 , 0xA7 , \
0xA8 , 0xA9 , 0xAA , 0xAB , 0xAC , 0xAD , 0xAE , 0xAF , \
0xB0 , 0xB1 , 0xB2 , 0xB3 , 0xB4 , 0xB5 , 0xB6 , 0xB7 , \
0xB8 , 0xB9 , 0xBA , 0xBB , 0xBC , 0xBD , 0xBE , 0xBF , \
0xC0 , 0xC1 , 0xC2 , 0xC3 , 0xC4 , 0xC5 , 0xC6 , 0xC7 , \
0xC8 , 0xC9 , 0xCA , 0xCB , 0xCC , 0xCD , 0xCE , 0xCF , \
0xD0 , 0xD1 , 0xD2 , 0xD3 , 0xD4 , 0xD5 , 0xD6 , 0xD7 , \
0xD8 , 0xD9 , 0xDA , 0xDB , 0xDC , 0xDD , 0xDE , 0xDF , \
0xE0 , 0xE1 , 0xE2 , 0xE3 , 0xE4 , 0xE5 , 0xE6 , 0xE7 , \
0xE8 , 0xE9 , 0xEA , 0xEB , 0xEC , 0xED , 0xEE , 0xEF , \
0xF0 , 0xF1 , 0xF2 , 0xF3 , 0xF4 , 0xF5 , 0xF6 , 0xF7 , \
0xF8 , 0xF9 , 0xFA , 0xFB , 0xFC \
};
// TOKENRING
#define TLAP_ADDR_LEN 6
// For the following offsets we assume that a TokenRing packet as handed to
// us will be complete EXCEPT for the "non-data" portions: Starting Delimiter
// (SD), Frame Check Sequence (FCS), End of Frame Sequence (EFS), and Ending
// Delimiter (ED).
#define TLAP_ACCESS_CTRL_OFFSET 0
#define TLAP_FRAME_CTRL_OFFSET 1
#define TLAP_DEST_OFFSET 2
#define TLAP_SRC_OFFSET 8
#define TLAP_ROUTE_INFO_OFFSET 14
// A few "magic" values:
#define TLAP_ACCESS_CTRL_VALUE 0x00 // Priority zero frame.
#define TLAP_FRAME_CTRL_VALUE 0x40 // LLC frame, priority zero.
#define TLAP_SRC_ROUTING_MASK 0x80 // In first byte of source
// address.
// Token ring source routing info stuff:
#define TLAP_ROUTE_INFO_SIZE_MASK 0x1F // In first byte of routing
// info, if present.
#define TLAP_MIN_ROUTING_BYTES 2
#define TLAP_MAX_ROUTING_BYTES MAX_ROUTING_BYTES
#define TLAP_MAX_ROUTING_SPACE MAX_ROUTING_SPACE
// Previously defined in ports.h
#define TLAP_BROADCAST_INFO_MASK 0xE0 // In first byte of routing
// info.
#define TLAP_NON_BROADCAST_MASK 0x1F // To reset above bits.
#define TLAP_DIRECTION_MASK 0x80 // In second byte of routing
// info.
#define TLAP_MIN_LINKHDR_LEN TLAP_ROUTE_INFO_OFFSET
#define TLAP_MAX_LINKHDR_LEN (TLAP_ROUTE_INFO_OFFSET + MAX_ROUTING_SPACE)
// Static "source routing" info for a TokenRing broadcast/multicast packet;
// the following values are set: single-route broadcast, 2 bytes of routing
// info, outgoing packet, broadcast (bigo) frame size.
//
#define TLAP_BROADCAST_ROUTE_INFO_INIT { 0xC2, 0x70 }
// Same stuff for a non-broadcast packet's simple routing info; the following
// values are set: non-broadcast, 2 bytes of routing info, outgoing packet,
// 802.5-style frame.
#define TLAP_SIMPLE_ROUTE_INFO_INIT { 0x02, 0x30 }
// The following may not really be safe, but, we'll make the assumption that
// all outgoing TokenTalk packets whos destination address starts with "0xC0
// 0x00" are broadcast (or multicast). Further, we assume that no packets
// that are intended to be boradcast/multicast will fail to meet this test.
// If this proves not to be the case, we'll need to find a new way to determine
// this from the destination address, or introduce a new perameter to the
// various "buildHeader" routines. This is all for "source routing" support.
#define TLAP_BROADCAST_DEST_HDR { 0xC0, 0x00}
#define TLAP_BROADCAST_DEST_LEN 2
// TokenRing multicast address:
#define TLAP_BROADCAST_ADDR_INIT \
{ 0xC0, 0x00, 0x40, 0x00, 0x00, 0x00 }
#define TLAP_ZONE_MULTICAST_ADDRS 19
#define TLAP_NUM_INIT_AARP_BUFFERS 6
#define TLAP_MCAST_HDR_LEN 2
GLOBAL BYTE AtalkTokenRingZoneMulticastAddrsHdr[TLAP_MCAST_HDR_LEN] EQU \
{ 0xC0, 0x00 };
GLOBAL BYTE AtalkTokenRingZoneMulticastAddrs \
[TLAP_ZONE_MULTICAST_ADDRS] \
[TLAP_ADDR_LEN - TLAP_MCAST_HDR_LEN] EQU \
{ \
{ 0x00, 0x00, 0x08, 0x00 }, \
{ 0x00, 0x00, 0x10, 0x00 }, \
{ 0x00, 0x00, 0x20, 0x00 }, \
{ 0x00, 0x00, 0x40, 0x00 }, \
{ 0x00, 0x00, 0x80, 0x00 }, \
{ 0x00, 0x01, 0x00, 0x00 }, \
{ 0x00, 0x02, 0x00, 0x00 }, \
{ 0x00, 0x04, 0x00, 0x00 }, \
{ 0x00, 0x08, 0x00, 0x00 }, \
{ 0x00, 0x10, 0x00, 0x00 }, \
{ 0x00, 0x20, 0x00, 0x00 }, \
{ 0x00, 0x40, 0x00, 0x00 }, \
{ 0x00, 0x80, 0x00, 0x00 }, \
{ 0x01, 0x00, 0x00, 0x00 }, \
{ 0x02, 0x00, 0x00, 0x00 }, \
{ 0x04, 0x00, 0x00, 0x00 }, \
{ 0x08, 0x00, 0x00, 0x00 }, \
{ 0x10, 0x00, 0x00, 0x00 }, \
{ 0x20, 0x00, 0x00, 0x00 } \
};
GLOBAL BYTE AtalkTlapBroadcastAddr[TLAP_ADDR_LEN] EQU \
TLAP_BROADCAST_ADDR_INIT;
GLOBAL BYTE AtalkBroadcastRouteInfo[TLAP_MIN_ROUTING_BYTES] EQU \
TLAP_BROADCAST_ROUTE_INFO_INIT;
GLOBAL BYTE AtalkSimpleRouteInfo[TLAP_MIN_ROUTING_BYTES] EQU \
TLAP_SIMPLE_ROUTE_INFO_INIT;
GLOBAL BYTE AtalkBroadcastDestHdr[TLAP_BROADCAST_DEST_LEN] EQU \
TLAP_BROADCAST_DEST_HDR;
// FDDI
#define FDDI_HEADER_BYTE 0x57 // Highest priority
#define MIN_FDDI_PKT_LEN 53 // From emperical data
#define FDDI_ADDR_LEN 6
#define FDDI_DEST_OFFSET 1
#define FDDI_SRC_OFFSET 7
#define FDDI_802DOT2_START_OFFSET 13
#define FDDI_LINKHDR_LEN 13
#define FDDI_NUM_INIT_AARP_BUFFERS 10
// LOCALTALK
#define ALAP_DEST_OFFSET 0
#define ALAP_SRC_OFFSET 1
#define ALAP_TYPE_OFFSET 2
#define ALAP_LINKHDR_LEN 3 // src, dest, lap type
#define ALAP_SDDP_HDR_TYPE 1
#define ALAP_LDDP_HDR_TYPE 2
#define ALAP_NUM_INIT_AARP_BUFFERS 0
// For send buffers, define a max. linkhdr len which is max of ELAP, TLAP, FDDI & ALAP
#define MAX_LINKHDR_LEN (IEEE8022_HDR_LEN + TLAP_MAX_LINKHDR_LEN)
#define MAX_SENDBUF_LEN (MAX_OPTHDR_LEN + MAX_LINKHDR_LEN + LDDP_HDR_LEN)
// Localtalk broadcast address: (only the first byte - 0xFF)
#define ALAP_BROADCAST_ADDR_INIT \
{ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00 }
// Completion routine type for ndis requests
typedef struct _SEND_COMPL_INFO
{
TRANSMIT_COMPLETION sc_TransmitCompletion;
PVOID sc_Ctx1;
PVOID sc_Ctx2;
PVOID sc_Ctx3;
} SEND_COMPL_INFO, *PSEND_COMPL_INFO;
typedef VOID (*SEND_COMPLETION)(
NDIS_STATUS Status,
PBUFFER_DESC BufferChain,
PSEND_COMPL_INFO SendInfo OPTIONAL
);
// For incoming packets:
// The structure of our ddp packets will be
// +-------+
// |Header |
//Returned->+-------+
//Ptr | DDP |
// | HDR |
// | DATA |
// | AARP |
// | DATA |
// +-------+
//
// The link header is stored in the ndis packet descriptor.
//
typedef struct _BUFFER_HDR
{
PNDIS_PACKET bh_NdisPkt;
PNDIS_BUFFER bh_NdisBuffer;
} BUFFER_HDR, *PBUFFER_HDR;
typedef struct _AARP_BUFFER
{
BUFFER_HDR ab_Hdr;
BYTE ab_Data[AARP_MAX_DATA_SIZE];
} AARP_BUFFER, *PAARP_BUFFER;
typedef struct _DDP_SMBUFFER
{
BUFFER_HDR dsm_Hdr;
BYTE dsm_Data[LDDP_HDR_LEN +
8 + // ATP header size
64]; // ASP Data size (Average)
} DDP_SMBUFFER, *PDDP_SMBUFFER;
typedef struct _DDP_LGBUFFER
{
BUFFER_HDR dlg_Hdr;
BYTE dlg_Data[MAX_LDDP_PKT_SIZE];
} DDP_LGBUFFER, *PDDP_LGBUFFER;
// BUFFERING for sends
// For outgoing packets, we preallocate buffer headers with buffer descriptors
// following it, and the link/ddp/max opt hdr len memory following it.
// +-------+
// |Header |
// +-------+
// |BuffDes|
// +-------+
// |MAXLINK|
// +-------+
// |MAX DDP|
// +-------+
// |MAX OPT|
// +-------+
//
// The header will contain a ndis buffer descriptor which will describe the
// MAXLINK/MAXDDP/MAXOPT area. Set the size before sending. And reset when
// Freeing. The next pointer in the buffer descriptor is used for chaining in
// free list.
//
// NOTE: Since for receives, we store the link header in the packet descriptor,
// the question arises, why not for sends? Because we want to use just one
// ndis buffer descriptor to describe all the non-data part.
//
// !!!!IMPORTANT!!!!
// The buffer descriptor header is accessed by going back from the buffer descriptor
// pointer, so its important that the buffer descriptor header start from an
// aligned address, i.e. make sure the structure does not contain elements that
// could throw it out of alignment.
typedef struct _SENDBUF
{
// NOTE: BUFFER_HDR must be the first thing. Look at AtalkBPAllocBlock();
BUFFER_HDR sb_BuffHdr;
BUFFER_DESC sb_BuffDesc;
BYTE sb_Space[MAX_SENDBUF_LEN];
} SENDBUF, *PSENDBUF;
// PROTOCOL RESERVED Structure
// This is what we expect to be in the packet descriptor. And we use it
// to store information to be used during the completion of the send/
// receives.
typedef struct
{
// !!!WARNING!!!
// pr_Linkage must be the first element in this structure for the
// CONTAINING_RECORD macro to work in receive completion.
union
{
struct
{
PPORT_DESCRIPTOR pr_Port;
PBUFFER_DESC pr_BufferDesc;
SEND_COMPLETION pr_SendCompletion;
SEND_COMPL_INFO pr_SendInfo;
} Send;
struct
{
LIST_ENTRY pr_Linkage;
PPORT_DESCRIPTOR pr_Port;
LOGICAL_PROTOCOL pr_Protocol;
NDIS_STATUS pr_ReceiveStatus;
PBUFFER_HDR pr_BufHdr;
BYTE pr_LinkHdr[TLAP_MAX_LINKHDR_LEN];
USHORT pr_DataLength;
BOOLEAN pr_Processed;
BYTE pr_OptimizeType;
BYTE pr_OptimizeSubType;
PVOID pr_OptimizeCtx;
ATALK_ADDR pr_SrcAddr;
ATALK_ADDR pr_DestAddr;
BOOLEAN pr_OffCablePkt;
union
{
// ATP Structure
struct
{
BYTE pr_AtpHdr[8]; // ATP header size
struct _ATP_ADDROBJ * pr_AtpAddrObj;
};
// ADSP Structure
};
} Receive;
};
} PROTOCOL_RESD, *PPROTOCOL_RESD;
// ATALK NDIS REQUEST
// Used to store completion routine information for NDIS requests.
typedef struct _ATALK_NDIS_REQ
{
NDIS_REQUEST nr_Request;
REQ_COMPLETION nr_RequestCompletion;
PVOID nr_Ctx;
KEVENT nr_Event;
NDIS_STATUS nr_RequestStatus;
BOOLEAN nr_Sync;
} ATALK_NDIS_REQ, *PATALK_NDIS_REQ;
#define GET_PORT_TYPE(medium) \
((medium == NdisMedium802_3) ? ELAP_PORT :\
((medium == NdisMediumFddi) ? FDDI_PORT :\
((medium == NdisMedium802_5) ? TLAP_PORT :\
((medium == NdisMediumLocalTalk) ? ALAP_PORT : \
0))))
// Handlers for the different port types.
typedef struct _PORT_HANDLERS
{
ADDMULTICASTADDR ph_AddMulticastAddr;
REMOVEMULTICASTADDR ph_RemoveMulticastAddr;
BYTE ph_BroadcastAddr[MAX_HW_ADDR_LEN];
USHORT ph_BroadcastAddrLen;
USHORT ph_AarpHardwareType;
USHORT ph_AarpProtocolType;
} PORT_HANDLERS, *PPORT_HANDLERS;
// MACROS for building/verifying 802.2 headers
#define ATALK_VERIFY8022_HDR(pPkt, PktLen, Protocol, Result) \
{ \
Result = TRUE; \
if ((PktLen >= (IEEE8022_PROTO_OFFSET+IEEE8022_PROTO_TYPE_LEN)) && \
(*(pPkt + IEEE8022_DSAP_OFFSET) == SNAP_SAP) && \
(*(pPkt + IEEE8022_SSAP_OFFSET) == SNAP_SAP) && \
(*(pPkt + IEEE8022_CONTROL_OFFSET)== UNNUMBERED_INFO)) \
{ \
if (!memcmp(pPkt + IEEE8022_PROTO_OFFSET, \
AtalkAppletalkProtocolType, \
IEEE8022_PROTO_TYPE_LEN)) \
{ \
Protocol = APPLETALK_PROTOCOL; \
} \
else if (!memcmp(pPkt + IEEE8022_PROTO_OFFSET, \
AtalkAarpProtocolType, \
IEEE8022_PROTO_TYPE_LEN)) \
{ \
Protocol = AARP_PROTOCOL; \
} \
else \
{ \
Result = FALSE; \
} \
} \
else \
{ \
Result = FALSE; \
} \
}
#define ATALK_BUILD8022_HDR(Packet, Protocol) \
{ \
PUTBYTE2BYTE( \
Packet + IEEE8022_DSAP_OFFSET, \
SNAP_SAP); \
\
PUTBYTE2BYTE( \
Packet + IEEE8022_SSAP_OFFSET, \
SNAP_SAP); \
\
PUTBYTE2BYTE( \
Packet + IEEE8022_CONTROL_OFFSET, \
UNNUMBERED_INFO); \
\
RtlCopyMemory( \
Packet + IEEE8022_PROTO_OFFSET, \
((Protocol == APPLETALK_PROTOCOL) ? \
AtalkAppletalkProtocolType : AtalkAarpProtocolType), \
IEEE8022_PROTO_TYPE_LEN); \
}
// Allocating and freeing send buffers
#define AtalkNdisAllocBuf(_ppBuffDesc) \
{ \
PSENDBUF _pSendBuf; \
\
_pSendBuf = AtalkBPAllocBlock(BLKID_SENDBUF); \
if ((_pSendBuf) != NULL) \
{ \
*(_ppBuffDesc) = &(_pSendBuf)->sb_BuffDesc; \
(_pSendBuf)->sb_BuffDesc.bd_Next = NULL; \
(_pSendBuf)->sb_BuffDesc.bd_Length = MAX_SENDBUF_LEN; \
(_pSendBuf)->sb_BuffDesc.bd_Flags = BD_CHAR_BUFFER; \
(_pSendBuf)->sb_BuffDesc.bd_CharBuffer= (_pSendBuf)->sb_Space; \
(_pSendBuf)->sb_BuffDesc.bd_FreeBuffer= NULL; \
} \
else \
{ \
*(_ppBuffDesc) = NULL; \
\
DBGPRINT(DBG_COMP_NDISSEND, DBG_LEVEL_ERR, \
("AtalkNdisAllocBuf: AtalkBPAllocBlock failed\n")); \
\
LOG_ERROR(EVENT_ATALK_NDISRESOURCES, \
NDIS_STATUS_RESOURCES, \
NULL, \
0); \
} \
}
#define AtalkNdisFreeBuf(_pBuffDesc) \
{ \
PSENDBUF _pSendBuf; \
\
ASSERT(VALID_BUFFDESC(_pBuffDesc)); \
_pSendBuf = (PSENDBUF)((PBYTE)(_pBuffDesc) - sizeof(BUFFER_HDR)); \
NdisAdjustBufferLength( \
(_pSendBuf)->sb_BuffHdr.bh_NdisBuffer, \
MAX_SENDBUF_LEN); \
AtalkBPFreeBlock((_pSendBuf)); \
}
// Exported Prototypes
ATALK_ERROR
AtalkInitNdisQueryAddrInfo(
IN PPORT_DESCRIPTOR pPortDesc
);
ATALK_ERROR
AtalkInitNdisStartPacketReception(
IN PPORT_DESCRIPTOR pPortDesc
);
ATALK_ERROR
AtalkInitNdisSetLookaheadSize(
IN PPORT_DESCRIPTOR pPortDesc,
IN INT LookaheadSize
);
ATALK_ERROR
AtalkNdisAddMulticast(
IN PPORT_DESCRIPTOR pPortDesc,
IN PBYTE Address,
IN BOOLEAN ExecuteSynchronously,
IN REQ_COMPLETION AddCompletion,
IN PVOID AddContext
);
ATALK_ERROR
AtalkNdisRemoveMulticast(
IN PPORT_DESCRIPTOR pPortDesc,
IN PBYTE Address,
IN BOOLEAN ExecuteSynchronously,
IN REQ_COMPLETION RemoveCompletion,
IN PVOID RemoveContext
);
ATALK_ERROR
AtalkNdisSendPacket(
IN PPORT_DESCRIPTOR pPortDesc,
IN PBUFFER_DESC BufferChain,
IN SEND_COMPLETION SendCompletion OPTIONAL,
IN PSEND_COMPL_INFO pSendInfo OPTIONAL
);
ATALK_ERROR
AtalkNdisAddFunctional(
IN PPORT_DESCRIPTOR pPortDesc,
IN PUCHAR Address,
IN BOOLEAN ExecuteSynchronously,
IN REQ_COMPLETION AddCompletion,
IN PVOID AddContext
);
ATALK_ERROR
AtalkNdisRemoveFunctional(
IN PPORT_DESCRIPTOR pPortDesc,
IN PUCHAR Address,
IN BOOLEAN ExecuteSynchronously,
IN REQ_COMPLETION RemoveCompletion,
IN PVOID RemoveContext
);
USHORT
AtalkNdisBuildEthHdr(
IN PUCHAR PortAddr, // 802 address of port
IN PBYTE pLinkHdr, // Start of link header
IN PBYTE pDestHwOrMcastAddr, // Destination or multicast addr
IN LOGICAL_PROTOCOL Protocol, // Logical protocol
IN USHORT ActualDataLen // Length for ethernet packets
);
USHORT
AtalkNdisBuildTRHdr(
IN PUCHAR PortAddr, // 802 address of port
IN PBYTE pLinkHdr, // Start of link header
IN PBYTE pDestHwOrMcastAddr, // Destination or multicast addr
IN LOGICAL_PROTOCOL Protocol, // Logical protocol
IN PBYTE pRouteInfo, // Routing info for tokenring
IN USHORT RouteInfoLen // Length of above
);
USHORT
AtalkNdisBuildFDDIHdr(
IN PUCHAR PortAddr, // 802 address of port
IN PBYTE pLinkHdr, // Start of link header
IN PBYTE pDestHwOrMcastAddr, // Destination or multicast addr
IN LOGICAL_PROTOCOL Protocol // Logical protocol
);
USHORT
AtalkNdisBuildLTHdr(
IN PBYTE pLinkHdr, // Start of link header
IN PBYTE pDestHwOrMcastAddr, // Destination or multicast addr
IN BYTE AlapSrc, // Localtalk source node
IN BYTE AlapType // Localtalk ddp header type
);
#define AtalkNdisBuildHdr(pPortDesc, \
pLinkHdr, \
linkLen, \
ActualDataLen, \
pDestHwOrMcastAddr, \
pRouteInfo, \
RouteInfoLen, \
Protocol) \
{ \
switch (pPortDesc->pd_NdisPortType) \
{ \
case NdisMedium802_3: \
linkLen = AtalkNdisBuildEthHdr( \
(pPortDesc)->pd_PortAddr, \
pLinkHdr, \
pDestHwOrMcastAddr, \
Protocol, \
ActualDataLen); \
break; \
\
case NdisMedium802_5: \
linkLen = AtalkNdisBuildTRHdr( \
(pPortDesc)->pd_PortAddr, \
pLinkHdr, \
pDestHwOrMcastAddr, \
Protocol, \
pRouteInfo, \
RouteInfoLen); \
break; \
\
case NdisMediumFddi: \
linkLen = AtalkNdisBuildFDDIHdr( \
(pPortDesc)->pd_PortAddr, \
pLinkHdr, \
pDestHwOrMcastAddr, \
Protocol); \
break; \
\
case NdisMediumLocalTalk: \
ASSERTMSG("AtalkNdisBuildHdr called for LT\n", 0); \
break; \
\
default: \
ASSERT (0); \
KeBugCheck(0); \
break; \
} \
}
VOID
AtalkNdisSendTokRingTestRespComplete(
IN NDIS_STATUS Status,
IN PBUFFER_DESC pBuffDesc,
IN PSEND_COMPL_INFO pInfo OPTIONAL);
VOID
AtalkNdisSendTokRingTestResp(
IN PPORT_DESCRIPTOR pPortDesc,
IN PBYTE HdrBuf,
IN UINT HdrBufSize,
IN PBYTE LkBuf,
IN UINT LkBufSize,
IN UINT pPktSize);
// PORT HANDLERS
//
GLOBAL PORT_HANDLERS AtalkPortHandlers[LAST_PORTTYPE] EQU \
{ \
{ \
AtalkNdisAddMulticast, \
AtalkNdisRemoveMulticast, \
ELAP_BROADCAST_ADDR_INIT, \
MAX_HW_ADDR_LEN, \
AARP_ELAP_HW_TYPE, \
AARP_ATALK_PROTO_TYPE \
}, \
{ \
AtalkNdisAddMulticast, \
AtalkNdisRemoveMulticast, \
ELAP_BROADCAST_ADDR_INIT, \
MAX_HW_ADDR_LEN, \
AARP_ELAP_HW_TYPE, \
AARP_ATALK_PROTO_TYPE \
}, \
{ \
AtalkNdisAddFunctional, \
AtalkNdisRemoveFunctional, \
TLAP_BROADCAST_ADDR_INIT, \
MAX_HW_ADDR_LEN, \
AARP_TLAP_HW_TYPE, \
AARP_ATALK_PROTO_TYPE \
}, \
{ \
NULL, \
NULL, \
ALAP_BROADCAST_ADDR_INIT, \
1, \
0, \
0 \
} \
};
// Exported Prototypes
ATALK_ERROR
AtalkNdisInitRegisterProtocol(
VOID
);
VOID
AtalkNdisDeregisterProtocol(
VOID
);
VOID
AtalkNdisReleaseResources(
VOID
);
NDIS_STATUS
AtalkNdisInitBind(
IN PPORT_DESCRIPTOR pPortDesc
);
VOID
AtalkNdisUnbind(
IN PPORT_DESCRIPTOR pPortDesc
);
NDIS_STATUS
AtalkNdisSubmitRequest(
PPORT_DESCRIPTOR pPortDesc,
PNDIS_REQUEST Request,
BOOLEAN ExecuteSync,
REQ_COMPLETION CompletionRoutine,
PVOID Ctx
);
VOID
AtalkOpenAdapterComplete(
IN NDIS_HANDLE NdisBindCtx,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
VOID
AtalkCloseAdapterComplete(
IN NDIS_HANDLE NdisBindCtx,
IN NDIS_STATUS Status
);
VOID
AtalkResetComplete(
IN NDIS_HANDLE NdisBindCtx,
IN NDIS_STATUS Status
);
VOID
AtalkRequestComplete(
IN NDIS_HANDLE NdisBindCtx,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status
);
VOID
AtalkStatusIndication (
IN NDIS_HANDLE NdisBindCtx,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuf,
IN UINT StatusBufLen
);
VOID
AtalkStatusComplete (
IN NDIS_HANDLE ProtoBindCtx
);
VOID
AtalkReceiveComplete (
IN NDIS_HANDLE BindingCtx
);
VOID
AtalkTransferDataComplete(
IN NDIS_HANDLE BindingCtx,
IN PNDIS_PACKET NdisPkt,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
);
NDIS_STATUS
AtalkReceiveIndication(
IN NDIS_HANDLE BindingCtx,
IN NDIS_HANDLE ReceiveCtx,
IN PVOID HdrBuf,
IN UINT HdrBufSize,
IN PVOID LkBuf,
IN UINT LkBufSize,
IN UINT PktSize
);
VOID
AtalkSendComplete(
IN NDIS_HANDLE ProtoBindCtx,
IN PNDIS_PACKET NdisPkt,
IN NDIS_STATUS NdisStatus
);
VOID
AtalkBindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2
);
VOID
AtalkUnbindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext
);
VOID
AtalkTranslatePnpId(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
OUT PNET_PNP_ID IdList,
IN ULONG IdListLength,
OUT PULONG BytesReturned
);
// Receive indication copy macro. This accomodates shared memory copies.
#define ATALK_RECV_INDICATION_COPY(_pPortDesc, _pDest, _pSrc, _Len) \
{ \
TdiCopyLookaheadData(_pDest, \
_pSrc, \
_Len, \
((_pPortDesc)->pd_MacOptions & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) ? \
TDI_RECEIVE_COPY_LOOKAHEAD : 0); \
}
#ifdef ATKNDIS_LOCALS
LOCAL NDIS_STATUS
atalkNdisInitInitializeResources(
VOID
);
#endif // ATKNDIS_LOCALS
#endif // _ATKNDIS_