976 lines
26 KiB
C
976 lines
26 KiB
C
|
/*++
|
||
|
|
||
|
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 (jameelh@microsoft.com)
|
||
|
Nikhil Kamkolkar (nikhilk@microsoft.com)
|
||
|
|
||
|
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 300
|
||
|
#define NUM_BUFFER_DESCRIPTORS 600
|
||
|
#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
|
||
|
|
||
|
#define AtalkNdisFreeBuffer(_ndisBuffer) \
|
||
|
{ \
|
||
|
PNDIS_BUFFER _ThisBuffer, _NextBuffer; \
|
||
|
\
|
||
|
_ThisBuffer = _ndisBuffer; \
|
||
|
while (_ThisBuffer) \
|
||
|
{ \
|
||
|
_NextBuffer = _ThisBuffer->Next; \
|
||
|
_ThisBuffer->Next = NULL; \
|
||
|
NdisFreeBuffer(_ThisBuffer); \
|
||
|
ATALK_DBG_DEC_COUNT(AtalkDbgMdlsAlloced);\
|
||
|
_ThisBuffer = _NextBuffer; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
// Values that are global to ndis routines
|
||
|
// These are the media the stack will support
|
||
|
extern NDIS_MEDIUM AtalkSupportedMedia[];
|
||
|
|
||
|
|
||
|
extern ULONG AtalkSupportedMediaSize;
|
||
|
|
||
|
extern NDIS_HANDLE AtalkNdisProtocolHandle;
|
||
|
|
||
|
extern BYTE AtalkElapBroadcastAddr[ELAP_ADDR_LEN];
|
||
|
|
||
|
extern BYTE AtalkAlapBroadcastAddr[];
|
||
|
|
||
|
extern BYTE AtalkAarpProtocolType[IEEE8022_PROTO_TYPE_LEN];
|
||
|
|
||
|
extern BYTE AtalkAppletalkProtocolType[IEEE8022_PROTO_TYPE_LEN];
|
||
|
|
||
|
extern ATALK_NETWORKRANGE AtalkStartupNetworkRange;
|
||
|
|
||
|
#define ELAP_MCAST_HDR_LEN (ELAP_ADDR_LEN - 1)
|
||
|
|
||
|
extern BYTE AtalkEthernetZoneMulticastAddrsHdr[ELAP_MCAST_HDR_LEN];
|
||
|
|
||
|
extern BYTE AtalkEthernetZoneMulticastAddrs[ELAP_ZONE_MULTICAST_ADDRS];
|
||
|
|
||
|
// 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)
|
||
|
|
||
|
#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
|
||
|
|
||
|
extern BYTE AtalkTokenRingZoneMulticastAddrsHdr[TLAP_MCAST_HDR_LEN];
|
||
|
|
||
|
extern BYTE AtalkTokenRingZoneMulticastAddrs[TLAP_ZONE_MULTICAST_ADDRS]
|
||
|
[TLAP_ADDR_LEN - TLAP_MCAST_HDR_LEN];
|
||
|
|
||
|
extern BYTE AtalkTlapBroadcastAddr[TLAP_ADDR_LEN];
|
||
|
|
||
|
extern BYTE AtalkBroadcastRouteInfo[TLAP_MIN_ROUTING_BYTES];
|
||
|
|
||
|
extern BYTE AtalkSimpleRouteInfo[TLAP_MIN_ROUTING_BYTES];
|
||
|
|
||
|
extern BYTE AtalkBroadcastDestHdr[TLAP_BROADCAST_DEST_LEN];
|
||
|
|
||
|
// 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
|
||
|
|
||
|
// WAN
|
||
|
#define WAN_LINKHDR_LEN 14
|
||
|
|
||
|
// 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)
|
||
|
|
||
|
//
|
||
|
// 14 for "fake" ethernet hdr, 5 (worst case, with non-optimized phase) for
|
||
|
// MNP LT hdr, 5 for Start,Stop flags)
|
||
|
//
|
||
|
#define MNP_MINSEND_LEN (MNP_MINPKT_SIZE + WAN_LINKHDR_LEN + 5 + 5 + 40)
|
||
|
#define MNP_MAXSEND_LEN (MNP_MAXPKT_SIZE + WAN_LINKHDR_LEN + 5 + 5 + 40)
|
||
|
|
||
|
// Localtalk broadcast address: (only the first byte - 0xFF)
|
||
|
#define ALAP_BROADCAST_ADDR_INIT \
|
||
|
{ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||
|
|
||
|
// there is no broadcast addr for Arap: just put 0's
|
||
|
#define ARAP_BROADCAST_ADDR_INIT \
|
||
|
{ 0x00, 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;
|
||
|
|
||
|
|
||
|
//
|
||
|
// !!!!IMPORTANT!!!!
|
||
|
// This structure needs to stay aligned (i.e. Buffer[1] field MUST start on an
|
||
|
// aligned addr! If necessary, add a padding!)
|
||
|
//
|
||
|
typedef struct _MNPSENDBUF
|
||
|
{
|
||
|
// NOTE: BUFFER_HDR must be the first thing. Look at AtalkBPAllocBlock();
|
||
|
BUFFER_HDR sb_BuffHdr;
|
||
|
BUFFER_DESC sb_BuffDesc;
|
||
|
LIST_ENTRY Linkage; // to queue in ArapRetransmitQ
|
||
|
#if DBG
|
||
|
DWORD Signature;
|
||
|
#endif
|
||
|
LONG RetryTime; // at this time, we will retransmit this send
|
||
|
|
||
|
PARAPCONN pArapConn; // who owns this send
|
||
|
PARAP_SEND_COMPLETION ComplRoutine; // routine to call when this send completes
|
||
|
LONG TimeAlloced; // time the first send came in on this buf
|
||
|
|
||
|
USHORT DataSize; // how much of the buffer is data
|
||
|
USHORT BytesFree; // can we stuff more packet(s)?
|
||
|
|
||
|
// NOTE: (Remember: Buffer[1] must start on DWORD boundary) see if we can make Flags a byte
|
||
|
DWORD Flags;
|
||
|
|
||
|
BYTE SeqNum; // sequence number used for this send
|
||
|
BYTE RetryCount; // how many times we have retransmitted this
|
||
|
BYTE RefCount; // free this buffer when refcount goes to 0
|
||
|
BYTE NumSends; // how many sends do we have stuffed here
|
||
|
PBYTE FreeBuffer; // pointer to free space
|
||
|
BYTE Buffer[1];
|
||
|
} MNPSENDBUF, *PMNPSENDBUF;
|
||
|
|
||
|
typedef struct _ARAPBUF
|
||
|
{
|
||
|
LIST_ENTRY Linkage; // to queue in ReceiveQ
|
||
|
#if DBG
|
||
|
DWORD Signature;
|
||
|
#endif
|
||
|
BYTE MnpFrameType; // type of frame this is (LT, LN etc.)
|
||
|
BYTE BlockId; // what kind of buffer is this
|
||
|
USHORT BufferSize; // how big is the buffer (set at init only)
|
||
|
USHORT DataSize; // how many bytes are valid (possible >1 srp)
|
||
|
PBYTE CurrentBuffer; // where does data begin...
|
||
|
BYTE Buffer[1]; // the buffer (with v42bis compressed pkt)
|
||
|
} ARAPBUF, *PARAPBUF;
|
||
|
|
||
|
|
||
|
#define ARAPCONN_SIGNATURE 0x99999999
|
||
|
#define ATCPCONN_SIGNATURE 0x88888888
|
||
|
|
||
|
#define MNPSMSENDBUF_SIGNATURE 0xbeef1111
|
||
|
#define MNPLGSENDBUF_SIGNATURE 0xbeef8888
|
||
|
|
||
|
#define ARAPSMPKT_SIGNATURE 0xcafe2222
|
||
|
#define ARAPMDPKT_SIGNATURE 0xcafe3333
|
||
|
#define ARAPLGPKT_SIGNATURE 0xcafe4444
|
||
|
|
||
|
#define ARAPLGBUF_SIGNATURE 0xdeebacad
|
||
|
#define ARAPUNLMTD_SIGNATURE 0xfafababa
|
||
|
|
||
|
|
||
|
// 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 : \
|
||
|
((medium == NdisMediumWan) ? ARAP_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;
|
||
|
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
AT_PNP_SWITCH_ROUTING=0,
|
||
|
AT_PNP_SWITCH_DEFAULT_ADAPTER,
|
||
|
AT_PNP_RECONFIGURE_PARMS
|
||
|
|
||
|
} ATALK_PNP_MSGTYPE;
|
||
|
|
||
|
typedef struct _ATALK_PNP_EVENT
|
||
|
{
|
||
|
ATALK_PNP_MSGTYPE PnpMessage;
|
||
|
} ATALK_PNP_EVENT, *PATALK_PNP_EVENT;
|
||
|
|
||
|
// 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)); \
|
||
|
}
|
||
|
|
||
|
|
||
|
#define ArapNdisFreeBuf(_pMnpSendBuf) \
|
||
|
{ \
|
||
|
PBUFFER_DESC _pBufDes; \
|
||
|
_pBufDes = &_pMnpSendBuf->sb_BuffDesc; \
|
||
|
\
|
||
|
DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_INFO, \
|
||
|
("ArapNdisFreeBuf: freeing %lx NdisPkt=%lx\n", \
|
||
|
_pMnpSendBuf,_pMnpSendBuf->sb_BuffHdr.bh_NdisPkt)); \
|
||
|
\
|
||
|
NdisAdjustBufferLength( \
|
||
|
(_pMnpSendBuf)->sb_BuffHdr.bh_NdisBuffer, \
|
||
|
(_pBufDes)->bd_Length); \
|
||
|
\
|
||
|
AtalkBPFreeBlock((_pMnpSendBuf)); \
|
||
|
}
|
||
|
|
||
|
|
||
|
// 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 AtalkNdisBuildARAPHdr(_pLnkHdr, _pConn) \
|
||
|
RtlCopyMemory(_pLnkHdr, _pConn->NdiswanHeader, WAN_LINKHDR_LEN)
|
||
|
|
||
|
#define AtalkNdisBuildPPPPHdr(_pLnkHdr, _pConn) \
|
||
|
RtlCopyMemory(_pLnkHdr, _pConn->NdiswanHeader, WAN_LINKHDR_LEN)
|
||
|
|
||
|
#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
|
||
|
//
|
||
|
extern PORT_HANDLERS AtalkPortHandlers[LAST_PORTTYPE];
|
||
|
|
||
|
// 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
|
||
|
);
|
||
|
|
||
|
ATALK_ERROR
|
||
|
ArapAdapterInit(
|
||
|
IN OUT PPORT_DESCRIPTOR pPortDesc
|
||
|
);
|
||
|
|
||
|
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
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
AtalkPnPHandler(
|
||
|
IN NDIS_HANDLE NdisBindCtx,
|
||
|
IN PNET_PNP_EVENT NetPnPEvent
|
||
|
);
|
||
|
|
||
|
|
||
|
NDIS_STATUS
|
||
|
AtalkPnPReconfigure(
|
||
|
IN NDIS_HANDLE NdisBindCtx,
|
||
|
IN PNET_PNP_EVENT NetPnPEvent
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
AtalkPnPDisableAdapter(
|
||
|
IN PPORT_DESCRIPTOR pPortDesc
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
AtalkPnPEnableAdapter(
|
||
|
IN PPORT_DESCRIPTOR pPortDesc
|
||
|
);
|
||
|
|
||
|
|
||
|
PPORT_DESCRIPTOR
|
||
|
AtalkFindDefaultPort(
|
||
|
IN VOID
|
||
|
);
|
||
|
|
||
|
// 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); \
|
||
|
}
|
||
|
|
||
|
LOCAL NDIS_STATUS
|
||
|
atalkNdisInitInitializeResources(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
#endif // _ATKNDIS_
|
||
|
|