813 lines
21 KiB
C
813 lines
21 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
dltyp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module includes all internal typedefs and constats
|
|||
|
of data link driver.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Antti Saarenheimo (o-anttis) 17-MAY-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "refcnt.h"
|
|||
|
|
|||
|
//
|
|||
|
// Design notes:
|
|||
|
// All data structures are designed at first for
|
|||
|
// multiple clients to make the interface very clean.
|
|||
|
// This implements also a simple kernel level interface
|
|||
|
// of data link layer to be used by somebody that needs it.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
struct _LLC_NDIS_PACKET;
|
|||
|
typedef struct _LLC_NDIS_PACKET LLC_NDIS_PACKET, *PLLC_NDIS_PACKET;
|
|||
|
|
|||
|
struct _LLC_SAP;
|
|||
|
typedef struct _LLC_SAP LLC_SAP, *PLLC_SAP;
|
|||
|
|
|||
|
struct _DATA_LINK;
|
|||
|
typedef struct _DATA_LINK DATA_LINK, *PDATA_LINK;
|
|||
|
|
|||
|
struct _ADAPTER_CONTEXT;
|
|||
|
typedef struct _ADAPTER_CONTEXT ADAPTER_CONTEXT, *PADAPTER_CONTEXT;
|
|||
|
|
|||
|
//
|
|||
|
// LLC_GENERIC_OBJECT - these fields are common in all LLC objects
|
|||
|
//
|
|||
|
|
|||
|
struct _LLC_GENERIC_OBJECT {
|
|||
|
|
|||
|
//
|
|||
|
// DEBUG version - we have a 16-byte identifier header for consistency
|
|||
|
// checking and to help when looking at DLC using the kernel debugger
|
|||
|
//
|
|||
|
|
|||
|
// DBG_OBJECT_ID;
|
|||
|
|
|||
|
//
|
|||
|
// pointer to singly-linked list of same-type structures
|
|||
|
//
|
|||
|
|
|||
|
PLLC_OBJECT pNext;
|
|||
|
|
|||
|
//
|
|||
|
// ObjectType - SAP, DIRECT or LINK
|
|||
|
//
|
|||
|
|
|||
|
UCHAR ObjectType;
|
|||
|
|
|||
|
//
|
|||
|
// EthernetType - if we have opened the adapter binding in AUTO mode then
|
|||
|
// for SAPs and Link Stations we need to determine whether to talk 802.3
|
|||
|
// or DIX
|
|||
|
//
|
|||
|
|
|||
|
UCHAR EthernetType;
|
|||
|
|
|||
|
//
|
|||
|
// usReserved - just aligns to DWORD (not necessary)
|
|||
|
//
|
|||
|
|
|||
|
USHORT usReserved;
|
|||
|
PADAPTER_CONTEXT pAdapterContext;
|
|||
|
PBINDING_CONTEXT pLlcBinding;
|
|||
|
|
|||
|
//
|
|||
|
// hClientHandle - handle to LINK object in upper layer
|
|||
|
//
|
|||
|
|
|||
|
PVOID hClientHandle;
|
|||
|
PLLC_PACKET pCompletionPackets;
|
|||
|
ULONG ReferenceCount;
|
|||
|
};
|
|||
|
|
|||
|
typedef struct _LLC_GENERIC_OBJECT LLC_GENERIC_OBJECT, *PLLC_GENERIC_OBJECT;
|
|||
|
|
|||
|
//
|
|||
|
// LLC_U_RESPONSE - LLC header for U-type response frame
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _LLC_U_RESPONSE {
|
|||
|
UCHAR Dsap; // Destination Service Access Point.
|
|||
|
UCHAR Ssap; // Source Service Access Point.
|
|||
|
UCHAR Command; // command code.
|
|||
|
UCHAR Info[1]; // respomse table
|
|||
|
} LLC_U_RESPONSE, *PLLC_U_RESPONSE;
|
|||
|
|
|||
|
//
|
|||
|
// QUEUE_PACKET - generic doubly-linked list header
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _QUEUE_PACKET {
|
|||
|
struct _QUEUE_PACKET* pNext;
|
|||
|
struct _QUEUE_PACKET* pPrev;
|
|||
|
} QUEUE_PACKET, *PQUEUE_PACKET;
|
|||
|
|
|||
|
//
|
|||
|
// LLC_QUEUE -
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _LLC_QUEUE {
|
|||
|
LIST_ENTRY ListEntry;
|
|||
|
LIST_ENTRY ListHead; // the list head
|
|||
|
PVOID pObject; // owner handle (used if element is linked)
|
|||
|
} LLC_QUEUE, *PLLC_QUEUE;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This information is a part of the DLC.STATISTICS
|
|||
|
// information for a link station. The whole
|
|||
|
// strcuture can be reseted.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _LINK_STATION_STATISTICS {
|
|||
|
USHORT I_FramesTransmitted;
|
|||
|
USHORT I_FramesReceived;
|
|||
|
UCHAR I_FrameReceiveErrors;
|
|||
|
UCHAR I_FrameTransmissionErrors;
|
|||
|
USHORT T1_ExpirationCount; // not in data xfer mode
|
|||
|
} LINK_STATION_STATISTICS, *PLINK_STATION_STATISTICS;
|
|||
|
|
|||
|
typedef struct _SAP_STATISTICS {
|
|||
|
ULONG FramesTransmitted;
|
|||
|
ULONG FramesReceived;
|
|||
|
ULONG FramesDiscardedNoRcv;
|
|||
|
ULONG DataLostCounter;
|
|||
|
} SAP_STATISTICS, *PSAP_STATISTICS;
|
|||
|
|
|||
|
struct _LLC_SAP {
|
|||
|
LLC_GENERIC_OBJECT Gen;
|
|||
|
USHORT SourceSap; // THIS MUST OVERLAY ObjectAddress
|
|||
|
USHORT OpenOptions;
|
|||
|
SAP_STATISTICS Statistics;
|
|||
|
|
|||
|
//
|
|||
|
// KEEP THIS SAME IN SAP STATION AND GENERIC OBJECT
|
|||
|
//
|
|||
|
|
|||
|
DLC_LINK_PARAMETERS DefaultParameters;
|
|||
|
NDIS_SPIN_LOCK FlowControlLock;
|
|||
|
PDATA_LINK pActiveLinks; // all link stations of this sap
|
|||
|
};
|
|||
|
|
|||
|
struct _TIMER_TICK;
|
|||
|
typedef struct _TIMER_TICK TIMER_TICK, *PTIMER_TICK;
|
|||
|
|
|||
|
typedef struct _LLC_TIMER {
|
|||
|
struct _LLC_TIMER* pNext;
|
|||
|
struct _LLC_TIMER* pPrev;
|
|||
|
PTIMER_TICK pTimerTick;
|
|||
|
ULONG ExpirationTime;
|
|||
|
PVOID hContext;
|
|||
|
|
|||
|
#if defined(LOCK_CHECK)
|
|||
|
|
|||
|
ULONG Disabled;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
} LLC_TIMER, *PLLC_TIMER;
|
|||
|
|
|||
|
struct _TIMER_TICK {
|
|||
|
struct _TIMER_TICK* pNext;
|
|||
|
// struct _TIMER_TICK* pPrev;
|
|||
|
PLLC_TIMER pFront;
|
|||
|
UINT DeltaTime;
|
|||
|
USHORT Input;
|
|||
|
USHORT ReferenceCount;
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// DATA_LINK - these 'objects' are from a two level data storage. The hash table
|
|||
|
// provides a very fast access to links, when there are less than 100 links
|
|||
|
// (about 99 % of the cases). The binary tree keeps the search times still quite
|
|||
|
// small, when there are very many connections from/to the same server.
|
|||
|
//
|
|||
|
|
|||
|
struct _DATA_LINK {
|
|||
|
LLC_GENERIC_OBJECT Gen;
|
|||
|
|
|||
|
//
|
|||
|
// Data link station state machine variables, *2 means the value
|
|||
|
// to be used as 2 increments, because modulo 256 is much easier
|
|||
|
// to handle than modulo 128. UCHAR wraps around automatically.
|
|||
|
//
|
|||
|
|
|||
|
SHORT Is_Ct; // Max number of I retries (Update_Va & xxx_Chkpt)
|
|||
|
USHORT Ia_Ct; // Number of LPDU acknowledgements since Ww was incr.
|
|||
|
|
|||
|
UCHAR State; // current state of the finite state machine
|
|||
|
UCHAR Ir_Ct; // LPDUs possible to send before next acknowledgement
|
|||
|
UCHAR Vs; // *2, Send state variable (Ns of next sent LPDU)
|
|||
|
UCHAR VsMax; // *2, Max Send state variable (Ns of next sent LPDU)
|
|||
|
UCHAR Vr; // *2, Receive state variable( Nr of next sent LPDU)
|
|||
|
|
|||
|
UCHAR Pf; // value of PollFinal bit in last command
|
|||
|
UCHAR Va; // *2, Last valid Nr received (ack state variable)
|
|||
|
UCHAR Vp; // *2, Poll state var. (Ns of last sent cmd with P-bit)
|
|||
|
UCHAR Vb; // Busy state (Vl, Vb, Vlb)
|
|||
|
|
|||
|
UCHAR Vc; // Stacked command variable (only DISC is possible)
|
|||
|
UCHAR Vi; // initialization state variable
|
|||
|
|
|||
|
//
|
|||
|
// BEGIN OF DLC_LINK_PARAMETERS (same as llc_params struct)
|
|||
|
// DON'T TOUCH !!!!
|
|||
|
//
|
|||
|
|
|||
|
UCHAR TimerT1; // Timer T1 value
|
|||
|
UCHAR TimerT2; // Timer T2 value
|
|||
|
|
|||
|
UCHAR TimerTi; // Timer Ti value
|
|||
|
UCHAR MaxOut; // *2, maximum transmit window size (MaxOut)
|
|||
|
UCHAR RW; // maximum receive window size (MaxIn)
|
|||
|
UCHAR Nw; // number of LPDUs acknowledged, before Ww is incr.)
|
|||
|
|
|||
|
UCHAR N2; // Number of retires allowed (both Polls and I LPDSs)
|
|||
|
UCHAR AccessPrty; // access priority
|
|||
|
USHORT MaxIField; // maximum received info field (not used in LLC)
|
|||
|
|
|||
|
//
|
|||
|
// End of DLC_LINK_PARAMETERS
|
|||
|
//
|
|||
|
|
|||
|
UCHAR Ww; // *2, working window size
|
|||
|
UCHAR N3; // number of I format LPDUs between acks (with Ir_Ct)
|
|||
|
UCHAR P_Ct; // Poll retry count
|
|||
|
UCHAR Nr; // last Nr of the received frame
|
|||
|
|
|||
|
//
|
|||
|
// Variables needed to maintain dynamic response base time for timers.
|
|||
|
//
|
|||
|
|
|||
|
USHORT LastTimeWhenCmdPollWasSent;
|
|||
|
USHORT AverageResponseTime;
|
|||
|
|
|||
|
UCHAR cbLanHeaderLength;
|
|||
|
UCHAR VrDuringLocalBusy;
|
|||
|
UCHAR Flags;
|
|||
|
UCHAR TW; // dynamic MaxOut value
|
|||
|
|
|||
|
USHORT FullWindowTransmits; // succeeded Polls of full window xmits
|
|||
|
UCHAR T1_Timeouts; // T1 timeouts after I-c1
|
|||
|
UCHAR RemoteOpen;
|
|||
|
|
|||
|
//
|
|||
|
// The link status flags contains these status bits:
|
|||
|
//
|
|||
|
// DLC_WAITING_RESPONSE_TO_POLL
|
|||
|
// DLC_FIRST_POLL
|
|||
|
// DLC_ACTIVE_REMOTE_CONECT_REQUEST
|
|||
|
// DLC_COMMAND_POLL_PENDING_IN_NDIS;
|
|||
|
// DLC_SEND_DISABLED
|
|||
|
// DLC_SEND_ACTIVE
|
|||
|
// DLC_LOCAL_BUSY_BUFFER
|
|||
|
// DLC_LOCAL_BUSY_USER
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// the timer objects
|
|||
|
//
|
|||
|
|
|||
|
LLC_TIMER T1;
|
|||
|
LLC_TIMER T2;
|
|||
|
LLC_TIMER Ti;
|
|||
|
|
|||
|
LLC_QUEUE SendQueue; // untransmitted queue for the I frames
|
|||
|
LIST_ENTRY SentQueue; // the sent but not acknowledged I- frames
|
|||
|
|
|||
|
PDATA_LINK pNextNode; // for the hash table
|
|||
|
LAN802_ADDRESS LinkAddr;// 64 bit lan address of the link
|
|||
|
|
|||
|
PLLC_SAP pSap; // link to the SAP object of this link
|
|||
|
|
|||
|
DLC_STATUS_TABLE DlcStatus;
|
|||
|
|
|||
|
//
|
|||
|
// Resetable link station statistics counters
|
|||
|
//
|
|||
|
|
|||
|
LINK_STATION_STATISTICS Statistics;
|
|||
|
|
|||
|
UCHAR LastCmdOrRespSent;
|
|||
|
UCHAR LastCmdOrRespReceived;
|
|||
|
UCHAR Dsap; // Destination SAP
|
|||
|
UCHAR Ssap; // Source SAP
|
|||
|
|
|||
|
//
|
|||
|
// some link statistics (don't reset this)
|
|||
|
//
|
|||
|
|
|||
|
ULONG BufferCommitment;
|
|||
|
|
|||
|
//
|
|||
|
// FramingType - type of framing (802.3/DIX/don't care) that we should use
|
|||
|
// for this connection. Required because in AUTO mode, the actual framing
|
|||
|
// type may be different than that in the BINDING_CONTEXT, and since the
|
|||
|
// BINDING_CONTEXT is per-adapter, we cannot rely on it (this whole thing
|
|||
|
// is messed up)
|
|||
|
//
|
|||
|
|
|||
|
ULONG FramingType;
|
|||
|
|
|||
|
//
|
|||
|
// Network frame header (includes the full address information)
|
|||
|
//
|
|||
|
|
|||
|
UCHAR auchLanHeader[1];
|
|||
|
|
|||
|
//
|
|||
|
// LAN HEADER OVERFLOWS HERE !!!!
|
|||
|
//
|
|||
|
};
|
|||
|
|
|||
|
typedef struct _LLC_STATION_OBJECT {
|
|||
|
LLC_GENERIC_OBJECT Gen;
|
|||
|
USHORT ObjectAddress;
|
|||
|
USHORT OpenOptions;
|
|||
|
SAP_STATISTICS Statistics;
|
|||
|
} LLC_STATION_OBJECT, *PLLC_STATION_OBJECT;
|
|||
|
|
|||
|
union _LLC_OBJECT {
|
|||
|
|
|||
|
//
|
|||
|
// KEEP THIS SAME AS DIRECT AND SAP STATIONS
|
|||
|
//
|
|||
|
|
|||
|
LLC_GENERIC_OBJECT Gen;
|
|||
|
DATA_LINK Link;
|
|||
|
LLC_SAP Sap;
|
|||
|
LLC_STATION_OBJECT Group;
|
|||
|
LLC_STATION_OBJECT Dix;
|
|||
|
LLC_STATION_OBJECT Dir;
|
|||
|
};
|
|||
|
|
|||
|
//*****************************************************************
|
|||
|
|
|||
|
typedef struct _NDIS_MAC_PACKET {
|
|||
|
NDIS_PACKET_PRIVATE private;
|
|||
|
UCHAR auchMacReserved[16];
|
|||
|
} NDIS_MAC_PACKET;
|
|||
|
|
|||
|
struct _LLC_NDIS_PACKET {
|
|||
|
NDIS_PACKET_PRIVATE private; // we accesss this also directly
|
|||
|
UCHAR auchMacReserved[16];
|
|||
|
PMDL pMdl; // MDL for LAN and LLC headers
|
|||
|
|
|||
|
//
|
|||
|
// request handle and command completion handler are saved to
|
|||
|
// the packet until NDIS has completed the command
|
|||
|
//
|
|||
|
|
|||
|
PLLC_PACKET pCompletionPacket;
|
|||
|
|
|||
|
#if LLC_DBG
|
|||
|
ULONG ReferenceCount;
|
|||
|
#endif
|
|||
|
|
|||
|
UCHAR auchLanHeader[LLC_MAX_LAN_HEADER + sizeof(LLC_U_HEADER) + sizeof(LLC_RESPONSE_INFO)];
|
|||
|
};
|
|||
|
|
|||
|
typedef struct _LLC_TRANSFER_PACKET {
|
|||
|
NDIS_PACKET_PRIVATE private;
|
|||
|
UCHAR auchMacReserved[16];
|
|||
|
PLLC_PACKET pPacket;
|
|||
|
} LLC_TRANSFER_PACKET, *PLLC_TRANSFER_PACKET;
|
|||
|
|
|||
|
typedef struct _EVENT_PACKET {
|
|||
|
struct _EVENT_PACKET* pNext;
|
|||
|
struct _EVENT_PACKET* pPrev;
|
|||
|
PBINDING_CONTEXT pBinding;
|
|||
|
PVOID hClientHandle;
|
|||
|
PVOID pEventInformation;
|
|||
|
UINT Event;
|
|||
|
UINT SecondaryInfo;
|
|||
|
} EVENT_PACKET, *PEVENT_PACKET;
|
|||
|
|
|||
|
//
|
|||
|
// The next structure is used only in the allocating packets to the pool
|
|||
|
//
|
|||
|
|
|||
|
typedef union _UNITED_PACKETS {
|
|||
|
QUEUE_PACKET queue;
|
|||
|
EVENT_PACKET event;
|
|||
|
LLC_PACKET XmitPacket;
|
|||
|
UCHAR auchLanHeader[LLC_MAX_LAN_HEADER];
|
|||
|
} UNITED_PACKETS, *PUNITED_PACKETS;
|
|||
|
|
|||
|
//
|
|||
|
// NODE_ADDRESS - 6 byte MAC address expressed as bytes or ULONG & USHORT for
|
|||
|
// minimal comparisons/moves on 32-bit architecture
|
|||
|
//
|
|||
|
|
|||
|
typedef union {
|
|||
|
UCHAR Bytes[6];
|
|||
|
struct {
|
|||
|
ULONG Top4;
|
|||
|
USHORT Bottom2;
|
|||
|
} Words;
|
|||
|
} NODE_ADDRESS, *PNODE_ADDRESS;
|
|||
|
|
|||
|
//
|
|||
|
// FRAMING_DISCOVERY_CACHE_ENTRY - the solution to the LLC_ETHERNET_TYPE_AUTO
|
|||
|
// problem (where we can end up proliferating TEST/XIDs and SABME/UAs) is to
|
|||
|
// keep a cache of destinations we have 'ping'ed with TEST/XID/SABME. We send
|
|||
|
// both frame types - DIX and 802.3. We indicate the first received response
|
|||
|
// and create a cache entry, recording the remote MAC address and the framing
|
|||
|
// type. If another response frame arrives from the cached MAC address with
|
|||
|
// the other framing type, it is discarded
|
|||
|
//
|
|||
|
|
|||
|
typedef struct {
|
|||
|
NODE_ADDRESS NodeAddress; // the remote MAC address
|
|||
|
BOOLEAN InUse; // TRUE if in use (could use TimeStamp == 0)
|
|||
|
UCHAR FramingType; // DIX or 802.3
|
|||
|
LARGE_INTEGER TimeStamp; // used for LRU throw-out
|
|||
|
} FRAMING_DISCOVERY_CACHE_ENTRY, *PFRAMING_DISCOVERY_CACHE_ENTRY;
|
|||
|
|
|||
|
#define FRAMING_TYPE_DIX 0x1d // arbitrary value
|
|||
|
#define FRAMING_TYPE_802_3 0x83 // " "
|
|||
|
|
|||
|
//
|
|||
|
// BINDING_CONTEXT - one of these created for each client (app/open driver
|
|||
|
// handle instance) opening the adapter. We only perform an open adapter at
|
|||
|
// NDIS level once, which creates the ADAPTER_CONTEXT for the NDIS open
|
|||
|
// adapter instance. Subsequent open adapter requests from processes cause
|
|||
|
// a BINDING_CONTEXT to be created and linked to the ADAPTER_CONTEXT
|
|||
|
//
|
|||
|
|
|||
|
struct _BINDING_CONTEXT {
|
|||
|
|
|||
|
//
|
|||
|
// DEBUG version - we have a 16-byte identifier header for consistency
|
|||
|
// checking and to help when looking at DLC using the kernel debugger
|
|||
|
//
|
|||
|
|
|||
|
// DBG_OBJECT_ID;
|
|||
|
|
|||
|
//
|
|||
|
// pointer to singly-linked list of BINDING_CONTEXT structures for this
|
|||
|
// ADAPTER_CONTEXT
|
|||
|
//
|
|||
|
|
|||
|
struct _BINDING_CONTEXT* pNext;
|
|||
|
|
|||
|
//
|
|||
|
// pointer to ADAPTER_CONTEXT structure for this BINDING_CONTEXT
|
|||
|
//
|
|||
|
|
|||
|
PADAPTER_CONTEXT pAdapterContext;
|
|||
|
|
|||
|
//
|
|||
|
// handle of/pointer to FILE_CONTEXT structure
|
|||
|
//
|
|||
|
|
|||
|
PVOID hClientContext;
|
|||
|
|
|||
|
//
|
|||
|
// pointers to command completion, receive and event indication functions
|
|||
|
//
|
|||
|
|
|||
|
PFLLC_COMMAND_COMPLETE pfCommandComplete;
|
|||
|
PFLLC_RECEIVE_INDICATION pfReceiveIndication;
|
|||
|
PFLLC_EVENT_INDICATION pfEventIndication;
|
|||
|
|
|||
|
//
|
|||
|
// Functional - functional address applied to this binding by the app
|
|||
|
//
|
|||
|
|
|||
|
TR_BROADCAST_ADDRESS Functional;
|
|||
|
|
|||
|
//
|
|||
|
// ulFunctionalZeroBits - mask of bits which should be off for functional
|
|||
|
// address/multicast address
|
|||
|
//
|
|||
|
|
|||
|
ULONG ulFunctionalZeroBits;
|
|||
|
|
|||
|
//
|
|||
|
// 0.5 second timer used for DIR.TIMER functions
|
|||
|
//
|
|||
|
|
|||
|
LLC_TIMER DlcTimer;
|
|||
|
|
|||
|
//
|
|||
|
// NdisMedium - the actual medium that the adapter to which we are bound talks
|
|||
|
//
|
|||
|
|
|||
|
UINT NdisMedium;
|
|||
|
|
|||
|
//
|
|||
|
// AddressTranslation - how the bits in addresses should be represented at
|
|||
|
// the top and bottom edges of LLC
|
|||
|
//
|
|||
|
|
|||
|
USHORT AddressTranslation;
|
|||
|
|
|||
|
//
|
|||
|
// BroadCastAddress - 6 byte broadcast address treated as USHORT and ULONG
|
|||
|
// entities. Used for checking promiscuous packets
|
|||
|
//
|
|||
|
|
|||
|
USHORT usBroadcastAddress;
|
|||
|
ULONG ulBroadcastAddress;
|
|||
|
|
|||
|
//
|
|||
|
// InternalAddressTranslation -
|
|||
|
//
|
|||
|
|
|||
|
USHORT InternalAddressTranslation;
|
|||
|
|
|||
|
//
|
|||
|
// EthernetType - value which determines the format of an Ethernet frame.
|
|||
|
// Different for 802.3 vs. DIX vs. ...
|
|||
|
//
|
|||
|
|
|||
|
USHORT EthernetType;
|
|||
|
|
|||
|
//
|
|||
|
// SwapCopiedLanAddresses - TRUE if we bit-swap LAN addresses when copying
|
|||
|
// up or down the layers
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN SwapCopiedLanAddresses;
|
|||
|
|
|||
|
//
|
|||
|
// The big substructures should be in the end
|
|||
|
// to produce optimal code for x86
|
|||
|
//
|
|||
|
|
|||
|
LLC_TRANSFER_PACKET TransferDataPacket;
|
|||
|
|
|||
|
//
|
|||
|
// FramingDiscoveryCacheEntries - maximum number of elements that can be
|
|||
|
// in DiscoveryFramingCache. Will be zero if the adapter is not ethernet and
|
|||
|
// LLC_ETHERNET_TYPE_AUTO was not requested, else number determined from
|
|||
|
// registry or default value. Number from registry may also be 0, indicating
|
|||
|
// caching is not to be used (old semantics)
|
|||
|
//
|
|||
|
|
|||
|
ULONG FramingDiscoveryCacheEntries;
|
|||
|
|
|||
|
//
|
|||
|
// FramingDiscoveryCache - if this EthernetType == LLC_ETHERNET_TYPE_AUTO,
|
|||
|
// we create a cache of destination MAC addresses and the DIX/802.3 framing
|
|||
|
// type they use. This array is FramingDiscoveryCacheEntries long
|
|||
|
//
|
|||
|
|
|||
|
FRAMING_DISCOVERY_CACHE_ENTRY FramingDiscoveryCache[];
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// ADAPTER_CONTEXT - the device context of an NDIS driver. It includes links to
|
|||
|
// all dynamic data structures of the data link driver.
|
|||
|
//
|
|||
|
// This version does not support the group SAPs
|
|||
|
//
|
|||
|
|
|||
|
#define LINK_HASH_SIZE 128
|
|||
|
|
|||
|
struct _ADAPTER_CONTEXT {
|
|||
|
|
|||
|
//
|
|||
|
// DEBUG version - we have a 16-byte identifier header for consistency
|
|||
|
// checking and to help when looking at DLC using the kernel debugger
|
|||
|
//
|
|||
|
|
|||
|
// DBG_OBJECT_ID;
|
|||
|
|
|||
|
//
|
|||
|
// pointer to singly-linked list of ADAPTER_CONTEXT structures opened by
|
|||
|
// all clients of this driver
|
|||
|
//
|
|||
|
|
|||
|
struct _ADAPTER_CONTEXT* pNext;
|
|||
|
|
|||
|
#if !defined(DLC_UNILOCK)
|
|||
|
|
|||
|
NDIS_SPIN_LOCK SendSpinLock; // locked when accessing send queues
|
|||
|
NDIS_SPIN_LOCK ObjectDataBase; // used also with sap/direct create
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
PLLC_STATION_OBJECT pDirectStation; // link list of direct stations
|
|||
|
PBINDING_CONTEXT pBindings; // link list of all bindings
|
|||
|
NDIS_HANDLE NdisBindingHandle;
|
|||
|
PVOID hLinkPool; // pool for link station structs
|
|||
|
PVOID hPacketPool; // pool for usr/small LLC packets
|
|||
|
|
|||
|
//
|
|||
|
// circular link list is free NDIS packets for send (initially maybe 5)
|
|||
|
//
|
|||
|
|
|||
|
PLLC_NDIS_PACKET pNdisPacketPool;
|
|||
|
NDIS_HANDLE hNdisPacketPool;
|
|||
|
|
|||
|
//
|
|||
|
// Some stuff for asynchronous receive indications
|
|||
|
//
|
|||
|
|
|||
|
PVOID hReceiveCompletionRequest;
|
|||
|
PLLC_PACKET pResetPackets;
|
|||
|
|
|||
|
//
|
|||
|
// pHeadBuf - pointer to the MAC header buffer, containing:
|
|||
|
//
|
|||
|
// FDDI:
|
|||
|
// 1 Byte Frame Control (FDDI)
|
|||
|
// 6 Bytes Destination MAC Address (ALL)
|
|||
|
// 6 Bytes Source MAC Address (ALL)
|
|||
|
//
|
|||
|
// Token Ring:
|
|||
|
// 1 Byte Access Control (Token Ring)
|
|||
|
// 1 Byte Frame Control (Token Ring)
|
|||
|
// 6 Bytes Destination MAC Address (ALL)
|
|||
|
// 6 Bytes Source MAC Address (ALL)
|
|||
|
// 0-18 Bytes Source Routing
|
|||
|
//
|
|||
|
// Ethernet:
|
|||
|
// 6 Bytes Destination MAC Address (ALL)
|
|||
|
// 6 Bytes Source MAC Address (ALL)
|
|||
|
// 2 Bytes Length or DIX Type
|
|||
|
//
|
|||
|
|
|||
|
PUCHAR pHeadBuf;
|
|||
|
|
|||
|
//
|
|||
|
// cbHeadBuf - number of bytes in pHeadBuf
|
|||
|
//
|
|||
|
|
|||
|
UINT cbHeadBuf;
|
|||
|
|
|||
|
//
|
|||
|
// pLookBuf - pointer to the MAC look-ahead buffer which contains the rest
|
|||
|
// of the data for this frame or as much as the MAC could fit into the look
|
|||
|
// ahead buffer (in which case NdisTransferData must be used to get the
|
|||
|
// rest)
|
|||
|
//
|
|||
|
|
|||
|
PUCHAR pLookBuf;
|
|||
|
|
|||
|
//
|
|||
|
// cbLookBuf - number of bytes in pLookBuf
|
|||
|
//
|
|||
|
|
|||
|
UINT cbLookBuf;
|
|||
|
|
|||
|
//
|
|||
|
// cbPacketSize - actual size of the whole frame. Calculated from information
|
|||
|
// in the header or supplied by the MAC, depending on the medium
|
|||
|
//
|
|||
|
|
|||
|
UINT cbPacketSize;
|
|||
|
|
|||
|
//
|
|||
|
// IsSnaDixFrame - true if the frame just received (on ethernet) is a DIX
|
|||
|
// frame and the DIX identifier is 0x80D5 (big-endian)
|
|||
|
//
|
|||
|
|
|||
|
UINT IsSnaDixFrame;
|
|||
|
LAN802_ADDRESS Adapter;
|
|||
|
ULONG MaxFrameSize;
|
|||
|
ULONG LinkSpeed;
|
|||
|
|
|||
|
//
|
|||
|
// We use UINTs, because (Move mem, ULONG) may not be an
|
|||
|
// atomic operation (in theory)
|
|||
|
//
|
|||
|
|
|||
|
UINT NdisMedium;
|
|||
|
UINT XidTestResponses;
|
|||
|
ULONG ObjectCount; // must be zero, when adapter closed
|
|||
|
|
|||
|
//
|
|||
|
// ConfigInfo - holds the SwapAddressBits and UseDixOverEthernet flags and
|
|||
|
// the timer tick values
|
|||
|
//
|
|||
|
|
|||
|
ADAPTER_CONFIGURATION_INFO ConfigInfo;
|
|||
|
|
|||
|
//
|
|||
|
// the original node addresses
|
|||
|
//
|
|||
|
|
|||
|
ULONG ulBroadcastAddress;
|
|||
|
|
|||
|
USHORT usBroadcastAddress;
|
|||
|
USHORT BackgroundProcessRequests;
|
|||
|
|
|||
|
UCHAR NodeAddress[6]; // Current network format
|
|||
|
USHORT cbMaxFrameHeader;
|
|||
|
|
|||
|
UCHAR PermanentAddress[6];
|
|||
|
USHORT OpenOptions;
|
|||
|
|
|||
|
USHORT AddressTranslationMode;
|
|||
|
USHORT FrameType;
|
|||
|
|
|||
|
USHORT usRcvMask;
|
|||
|
USHORT EthernetType;
|
|||
|
|
|||
|
USHORT RcvLanHeaderLength;
|
|||
|
USHORT BindingCount;
|
|||
|
|
|||
|
USHORT usHighFunctionalBits;
|
|||
|
|
|||
|
//
|
|||
|
// Keep UCHAR alignment
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN boolTranferDataNotComplete;
|
|||
|
BOOLEAN IsDirty;
|
|||
|
BOOLEAN ResetInProgress;
|
|||
|
UCHAR Unused1;
|
|||
|
|
|||
|
#ifndef NDIS40
|
|||
|
// Not used.
|
|||
|
UCHAR AdapterNumber;
|
|||
|
#endif // NDIS40
|
|||
|
UCHAR IsBroadcast;
|
|||
|
BOOLEAN SendProcessIsActive;
|
|||
|
BOOLEAN LlcPacketInSendQueue;
|
|||
|
|
|||
|
//
|
|||
|
// We keep the big structures and tables in the end,
|
|||
|
// that makes most x86 offsets 1 byte instead of 4.
|
|||
|
// The compiler aligns the fields naturally, whenever
|
|||
|
// it is necessary.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// the next elements will be linked to circular
|
|||
|
// end process link list, if there are any frames to send
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY NextSendTask; // pointer to active sends
|
|||
|
LIST_ENTRY QueueEvents;
|
|||
|
LIST_ENTRY QueueCommands;
|
|||
|
LLC_QUEUE QueueI;
|
|||
|
LLC_QUEUE QueueDirAndU;
|
|||
|
LLC_QUEUE QueueExpidited;
|
|||
|
UNICODE_STRING Name; // current adapter name
|
|||
|
PTIMER_TICK pTimerTicks;
|
|||
|
|
|||
|
NDIS_STATUS AsyncOpenStatus; // used to wait async open
|
|||
|
NDIS_STATUS AsyncCloseResetStatus; // used to wait async close
|
|||
|
NDIS_STATUS OpenCompleteStatus; // used to wait the first open
|
|||
|
NDIS_STATUS LinkRcvStatus; // link state machine ret status
|
|||
|
NDIS_STATUS NdisRcvStatus; // NdisRcvIndication ret status
|
|||
|
NDIS_STATUS OpenErrorStatus; // special adapter open status
|
|||
|
|
|||
|
//
|
|||
|
// NDIS calls back when adapter open completes. Use a Kernel Event to
|
|||
|
// synchronize LLC with NDIS
|
|||
|
//
|
|||
|
|
|||
|
KEVENT Event;
|
|||
|
|
|||
|
//
|
|||
|
// the following are reasonably large arrays (like 256 pointers to SAP
|
|||
|
// objects...)
|
|||
|
//
|
|||
|
|
|||
|
PLLC_SAP apSapBindings[256]; // the clients bound to the SAPs
|
|||
|
PDATA_LINK aLinkHash[LINK_HASH_SIZE]; // hash table to links
|
|||
|
PLLC_STATION_OBJECT aDixStations[MAX_DIX_TABLE];
|
|||
|
LLC_TRANSFER_PACKET TransferDataPacket;
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
//
|
|||
|
// memory usage counters for memory owned by this ADAPTER_CONTEXT
|
|||
|
//
|
|||
|
|
|||
|
MEMORY_USAGE MemoryUsage;
|
|||
|
MEMORY_USAGE StringUsage;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef NDIS40
|
|||
|
|
|||
|
#define BIND_STATE_UNBOUND 1
|
|||
|
#define BIND_STATE_UNBINDING 2
|
|||
|
#define BIND_STATE_BOUND 3
|
|||
|
|
|||
|
LONG BindState;
|
|||
|
REF_CNT AdapterRefCnt;
|
|||
|
KEVENT CloseAdapterEvent;
|
|||
|
#endif // NDIS40
|
|||
|
};
|
|||
|
|
|||
|
typedef PLLC_PACKET (*PF_GET_PACKET)(IN PADAPTER_CONTEXT pAdapterContext);
|
|||
|
|