/*++ Copyright (c) 1997 FORE Systems, Inc. Copyright (c) 1997 Microsoft Corporation Module Name: atmlane.h Abstract: Author: Larry Cleeton, FORE Systems (v-lcleet@microsoft.com, lrc@fore.com) Environment: Kernel mode Revision History: --*/ #ifndef __ATMLANE_ATMLANE_H #define __ATMLANE_ATMLANE_H // // Configuration defaults and stuff // #define DEF_HEADER_BUF_SIZE LANE_HEADERSIZE #define DEF_HDRBUF_GROW_SIZE 50 // these used for packet pad buffers also #define DEF_MAX_HEADER_BUFS 300 #define DEF_PROTOCOL_BUF_SIZE sizeof(LANE_CONTROL_FRAME) #define DEF_MAX_PROTOCOL_BUFS 100 #define MCAST_LIST_SIZE 32 #define FAST_VC_TIMEOUT 30 // seconds // // The registry parameter strings // #define ATMLANE_LINKNAME_STRING L"\\DosDevices\\AtmLane" #define ATMLANE_NTDEVICE_STRING L"\\Device\\AtmLane" #define ATMLANE_PROTOCOL_STRING L"AtmLane" #define ATMLANE_USELECS_STRING L"UseLecs" #define ATMLANE_DISCOVERLECS_STRING L"DiscoverLecs" #define ATMLANE_LECSADDR_STRING L"LecsAddr" #define ATMLANE_ELANLIST_STRING L"ElanList" #define ATMLANE_DEVICE_STRING L"Device" #define ATMLANE_ELANNAME_STRING L"ElanName" #define ATMLANE_LANTYPE_STRING L"LanType" #define ATMLANE_MAXFRAMESIZE_STRING L"MaxFrameSizeCode" #define ATMLANE_MACADDR_STRING L"MacAddr" #define ATMLANE_LESADDR_STRING L"LesAddr" #define ATMLANE_HEADERBUFSIZE_STRING L"HeaderBufSize" #define ATMLANE_MAXHEADERBUFS_STRING L"MaxHeaderBufs" #define ATMLANE_MAXPROTOCOLBUFS_STRING L"MaxProtocolBufs" #define ATMLANE_UPPERBINDINGS_STRING L"UpperBindings" #define ATMLANE_DATADIRECTPCR_STRING L"DataDirectPCR" // // MAC table size // Current sized at 256. // Hash function currently uses byte 5 of MAC Address as index. // Some research at Digital has shown it to be the best byte to use. // #define ATMLANE_MAC_TABLE_SIZE 256 // // Some misc defaults // #define ATMLANE_DEF_MAX_AAL5_PDU_SIZE ((64*1024)-1) // // Timer configuration. // #define ALT_MAX_TIMER_SHORT_DURATION 60 // Seconds #define ALT_MAX_TIMER_LONG_DURATION (30*60) // Seconds #define ALT_SHORT_DURATION_TIMER_PERIOD 1 // Second #define ALT_LONG_DURATION_TIMER_PERIOD 10 // Seconds // // Foward References // struct _ATMLANE_VC; struct _ATMLANE_ATM_ENTRY; struct _ATMLANE_ELAN; struct _ATMLANE_ADAPTER; // // Blocking data structure. // typedef struct _ATMLANE_BLOCK { NDIS_EVENT Event; NDIS_STATUS Status; } ATMLANE_BLOCK, *PATMLANE_BLOCK; // // The following object is a convenient way to // store and access an IEEE 48-bit MAC address. // typedef struct _MAC_ADDRESS { UCHAR Byte[6]; } MAC_ADDRESS, *PMAC_ADDRESS; // // Packet context data in ProtocolReserved area of // NDIS Packet header owned by ATMLANE. // typedef struct _SEND_PACKET_RESERVED { #if DBG ULONG Signature; PNDIS_PACKET pNextInSendList; #endif ULONG Flags; PNDIS_PACKET pOrigNdisPacket; ULONG OrigBufferCount; ULONG OrigPacketLength; ULONG WrappedBufferCount; PNDIS_PACKET pNextNdisPacket; #if PROTECT_PACKETS ATMLANE_LOCK Lock; NDIS_STATUS CompletionStatus; #endif // PROTECT_PACKETS } SEND_PACKET_RESERVED, *PSEND_PACKET_RESERVED; // // Packet context data in MiniportReserved area of // NDIS packet header owned by ATMLANE. // typedef struct _RECV_PACKET_RESERVED { ULONG Flags; PNDIS_PACKET pNdisPacket; } RECV_PACKET_RESERVED, *PRECV_PACKET_RESERVED; // // Definitions of Flags in both (SEND/RECV)_PACKET_RESERVED. // #define PACKET_RESERVED_OWNER_MASK 0x00000007 #define PACKET_RESERVED_OWNER_PROTOCOL 0x00000001 #define PACKET_RESERVED_OWNER_ATMLANE 0x00000002 #define PACKET_RESERVED_OWNER_MINIPORT 0x00000004 #if PROTECT_PACKETS #define PACKET_RESERVED_COSENDRETURNED 0x10000000 #define PACKET_RESERVED_COMPLETED 0x01000000 #endif // PROTECT_PACKETS #define PSEND_RSVD(_pPkt) \ ((PSEND_PACKET_RESERVED)(&((_pPkt)->ProtocolReserved))) #define ZERO_SEND_RSVD(_pPkt) \ NdisZeroMemory(&((_pPkt)->ProtocolReserved), sizeof(SEND_PACKET_RESERVED)) // // ------------------------ Global Data Object ------------------------ // typedef struct _ATMLANE_GLOBALS { #if DBG ULONG atmlane_globals_sig; // debug signature #endif ATMLANE_LOCK GlobalLock; // global data lock ATMLANE_BLOCK Block; NDIS_HANDLE NdisWrapperHandle; // returned by NdisMInitializeWrapper NDIS_HANDLE MiniportDriverHandle; // returned by NdisIMRegisterLayeredMiniport NDIS_HANDLE NdisProtocolHandle; // returned by NdisRegisterProtocol LIST_ENTRY AdapterList; // list of bound adapters PDRIVER_OBJECT pDriverObject; // our driver object PDEVICE_OBJECT pSpecialDeviceObject; // special protocol ioctl device object ptr NDIS_HANDLE SpecialNdisDeviceHandle;// special protocol ioctl device handle } ATMLANE_GLOBALS, *PATMLANE_GLOBALS; #if DBG #define atmlane_globals_signature 'LGLA' #endif // // ------------------------ Timer Management ------------------------ // struct _ATMLANE_TIMER ; struct _ATMLANE_TIMER_LIST ; // // Timeout Handler prototype // typedef VOID (*ATMLANE_TIMEOUT_HANDLER)( IN struct _ATMLANE_TIMER * pTimer, IN PVOID ContextPtr ); // // An ATMLANE_TIMER structure is used to keep track of each timer // in the ATMLANE module. // typedef struct _ATMLANE_TIMER { struct _ATMLANE_TIMER * pNextTimer; struct _ATMLANE_TIMER * pPrevTimer; struct _ATMLANE_TIMER * pNextExpiredTimer; // Used to chain expired timers struct _ATMLANE_TIMER_LIST * pTimerList; // NULL iff this timer is inactive ULONG Duration; // In seconds ULONG LastRefreshTime; ATMLANE_TIMEOUT_HANDLER TimeoutHandler; PVOID ContextPtr; // To be passed to timeout handler } ATMLANE_TIMER, *PATMLANE_TIMER; // // NULL pointer to ATMLANE Timer // #define NULL_PATMLANE_TIMER ((PATMLANE_TIMER)NULL) // // Control structure for a timer wheel. This contains all information // about the class of timers that it implements. // typedef struct _ATMLANE_TIMER_LIST { #if DBG ULONG atmlane_timerlist_sig; #endif // DBG PATMLANE_TIMER pTimers; // List of timers ULONG TimerListSize; // Length of above ULONG CurrentTick; // Index into above ULONG TimerCount; // Number of running timers ULONG MaxTimer; // Max timeout value for this NDIS_TIMER NdisTimer; // System support UINT TimerPeriod; // Interval between ticks PVOID ListContext; // Used as a back pointer to the // Interface structure } ATMLANE_TIMER_LIST, *PATMLANE_TIMER_LIST; #if DBG #define atmlane_timerlist_signature 'LTLA' #endif // DBG // // Timer Classes // typedef enum { ALT_CLASS_SHORT_DURATION, ALT_CLASS_LONG_DURATION, ALT_CLASS_MAX } ATMLANE_TIMER_CLASS; // // ------------------------ ATMLANE SAP -------------------------------- // // Each of these structures maintains information about an individual SAP // associated with an ELAN. Each ELAN registers 3 SAPs. // - Incoming Control Distribute VC // - Incoming Data Direct VCs // - Incoming Multicast Forward VC // typedef struct _ATMLANE_SAP { #if DBG ULONG atmlane_sap_sig; #endif struct _ATMLANE_ELAN * pElan ; // back pointer NDIS_HANDLE NdisSapHandle; ULONG Flags; // state information ULONG LaneType; // LES\BUS\DATA PCO_SAP pInfo; // SAP characteristics. } ATMLANE_SAP, *PATMLANE_SAP; #if DBG #define atmlane_sap_signature 'PSLA' #endif // // NULL pointer to ATMLANE SAP // #define NULL_PATMLANE_SAP ((PATMLANE_SAP)NULL) // // Definitions for Flags in ATMLANE SAP // // // Bits 0 to 3 contain the SAP-registration state. // #define SAP_REG_STATE_MASK 0x0000000f #define SAP_REG_STATE_IDLE 0x00000000 #define SAP_REG_STATE_REGISTERING 0x00000001 // Sent RegisterSap #define SAP_REG_STATE_REGISTERED 0x00000002 // RegisterSap completed #define SAP_REG_STATE_DEREGISTERING 0x00000004 // Sent DeregisterSap // // ---- ATMLANE Buffer Tracker ---- // // Keeps track of allocation information for a pool of buffers. A list // of these structures is used to maintain info about a dynamically // growable pool of buffers (e.g. for LANE data packet header buffers) // typedef struct _ATMLANE_BUFFER_TRACKER { struct _ATMLANE_BUFFER_TRACKER * pNext; // in a list of trackers NDIS_HANDLE NdisHandle; // for Buffer Pool PUCHAR pPoolStart; // start of memory chunk allocated // from the system } ATMLANE_BUFFER_TRACKER, *PATMLANE_BUFFER_TRACKER; // // NULL pointer to ATMARP Buffer tracker structure // #define NULL_PATMLANE_BUFFER_TRACKER ((PATMLANE_BUFFER_TRACKER)NULL) // // ------------------------ ATM Address Entry ------------------------ // // All information about an ATM destination and the VCs associated // with it. One of these entries is used for a given ATM Address // with the exception of LANE services ATM Addresses // // It is deleted when all references (see below) to this entry are gone. // // One Data Direct VC can associated with this entry. One or more ARP Table // Entries could point to this entry, because more than one MAC address // could map to this ATM address. // // Reference Count: we add one to the RefCount for each of the following: // - Each VC associated with the entry. // - Each MAC Entry that points to it. // - BusTimer active. // - FlushTimer active. // - For the duration that another structure points to it. // typedef struct _ATMLANE_ATM_ENTRY { #if DBG ULONG atmlane_atm_sig; // Signature for debugging #endif struct _ATMLANE_ATM_ENTRY * pNext; // Next entry on this elan ULONG RefCount; // References to this struct ULONG Flags; // State information ULONG Type; // Type of entry ATMLANE_LOCK AeLock; struct _ATMLANE_ELAN * pElan; // Back pointer to parent struct _ATMLANE_VC * pVcList; // List of VCs to this address struct _ATMLANE_VC * pVcIncoming; // Optional incoming VC if server struct _ATMLANE_MAC_ENTRY * pMacEntryList; // List of MAC entries that // point to this entry ATM_ADDRESS AtmAddress; // ATM Address of this entry PATMLANE_TIMER FlushTimer; // Flush protocol timer ULONG FlushTid; // Transaction ID of Flush Request } ATMLANE_ATM_ENTRY, *PATMLANE_ATM_ENTRY; #if DBG #define atmlane_atm_signature 'EALA' #endif // // NULL pointer to ATMLANE ATM ENTRY // #define NULL_PATMLANE_ATM_ENTRY ((PATMLANE_ATM_ENTRY)NULL) // // Definitions for Flags in ATMLANE ATM ENTRY // // // Bits 0-4 contain the state of an ATM Entry. // #define ATM_ENTRY_STATE_MASK 0x00000007 #define ATM_ENTRY_IDLE 0x00000000 // Just created #define ATM_ENTRY_VALID 0x00000001 // Installed into the database #define ATM_ENTRY_CONNECTED 0x00000002 // VC connected #define ATM_ENTRY_CLOSING 0x00000004 // entry is about to go away #define ATM_ENTRY_CALLINPROGRESS 0x00000010 // Call underway #define ATM_ENTRY_WILL_ABORT 0x80000000 // Preparing to abort this // // Definitions for Type in ATMLANE ATM ENTRY // #define ATM_ENTRY_TYPE_PEER 0 #define ATM_ENTRY_TYPE_LECS 1 #define ATM_ENTRY_TYPE_LES 2 #define ATM_ENTRY_TYPE_BUS 3 // // ------------------------ MAC (ARP Table) Entry ------------------------ // // Contains information about one remote MAC address. // // It is assumed that each MAC address resolves to exactly on ATM address. // So there is at most one ARP Table entry for a given MAC address. // // The MAC entry participates in two lists: // (1) A list of all entries that hash to the same bucket in the ARP Table. // (2) A list of all entries that resolve to the same ATM address. // // Reference Count: We add one to its ref count for each of the following: // - For the duration an active timer exists on this entry. // - For the duration the entry belongs to the list of MAC entries linked // to an ATM entry. // typedef struct _ATMLANE_MAC_ENTRY { #if DBG ULONG atmlane_mac_sig; // Signature for debugging #endif struct _ATMLANE_MAC_ENTRY * pNextEntry; // Next in hash list struct _ATMLANE_MAC_ENTRY * pNextToAtm; // List of entries pointing to // the save ATM Entry ULONG RefCount; // References to this struct ULONG Flags; // State and Type information ATMLANE_LOCK MeLock; // Lock for this structure MAC_ADDRESS MacAddress; // MAC Address ULONG MacAddrType; // Type of Addr (MAC vs RD) struct _ATMLANE_ELAN * pElan; // Back pointer to Elan PATMLANE_ATM_ENTRY pAtmEntry; // Pointer to ATM entry ATMLANE_TIMER Timer; // For ARP and Aging ATMLANE_TIMER FlushTimer; // For Flushing ULONG RetriesLeft; // Number of ARP retries left PNDIS_PACKET PacketList; // Packet list ULONG PacketListCount; // Number packets queued NDIS_TIMER BusTimer; // For metering Bus Sends ULONG BusyTime; // For metering Bus Sends ULONG LimitTime; // For metering Bus Sends ULONG IncrTime; // For metering Bus Sends ULONG FlushTid; // TID of outstanding flush ULONG ArpTid; // TID of outstanding arp } ATMLANE_MAC_ENTRY, *PATMLANE_MAC_ENTRY; #if DBG #define atmlane_mac_signature 'EMLA' #endif // // NULL pointer to ATMLANE MAC ENTRY // #define NULL_PATMLANE_MAC_ENTRY ((PATMLANE_MAC_ENTRY)NULL) // // Definitions for Flags in ATMLANE MAC ENTRY // #define MAC_ENTRY_STATE_MASK 0x0000007F #define MAC_ENTRY_NEW 0x00000001 // Brand new #define MAC_ENTRY_ARPING 0x00000002 // Running ARP protocol #define MAC_ENTRY_RESOLVED 0x00000004 // Calling #define MAC_ENTRY_FLUSHING 0x00000008 // Flushing #define MAC_ENTRY_ACTIVE 0x00000010 // Connected #define MAC_ENTRY_AGED 0x00000020 // Aged Out #define MAC_ENTRY_ABORTING 0x00000040 // Aborting #define MAC_ENTRY_BROADCAST 0x00010000 // Is broadcast address (BUS) #define MAC_ENTRY_BUS_TIMER 0x00040000 // BUS timer running #define MAC_ENTRY_USED_FOR_SEND 0x00080000 // Was used for send // // ------------------------ ATMLANE Virtual Circuit (VC) --------------------- // // One of these is used for each call terminated at the ELAN. // Creation and deletion of this structure is linked to NdisCoCreateVc and // NdisCoDeleteVc. // typedef struct _ATMLANE_VC { #if DBG ULONG atmlane_vc_sig; // Signature for debuging #endif struct _ATMLANE_VC * pNextVc; // Next VC in list ULONG RefCount; // References to this struct ULONG OutstandingSends; // Packets pending CoSendComplete ATMLANE_LOCK VcLock; ULONG Flags; // State and Type information ULONG LaneType; // LANE type of VC NDIS_HANDLE NdisVcHandle; // NDIS handle for this VC struct _ATMLANE_ELAN * pElan; // Back pointer to parent Elan PATMLANE_ATM_ENTRY pAtmEntry; // Back pointer to ATM Entry ATMLANE_TIMER AgingTimer; // Aging Timer ULONG AgingTime; // Aging Time ATMLANE_TIMER ReadyTimer; // Ready Timer ULONG RetriesLeft; // retries left ATM_ADDRESS CallingAtmAddress; // Calling party ATM Address // in call for this VC ULONG ReceiveActivity; // non-zero if receive activity seen } ATMLANE_VC, *PATMLANE_VC; #if DBG #define atmlane_vc_signature 'CVLA' #endif // // NULL pointer to ATMLANE VC // #define NULL_PATMLANE_VC ((PATMLANE_VC)NULL) // // Definitions for ATMLANE VC flags. The following information is kept // here: // - Is this VC an SVC or PVC // - Is this created (owned) by an Elan or the Call Manager // - Call State: Incoming in progress, Outgoing in progress, Active, // - LANE Ready state // - Close in progress // // Bits 0-1 for svc vs pvc type #define VC_TYPE_MASK 0x00000003 #define VC_TYPE_UNUSED 0x00000000 #define VC_TYPE_SVC 0x00000001 #define VC_TYPE_PVC 0x00000002 // Bits 2-3 for "Owner" #define VC_OWNER_MASK 0x0000000C #define VC_OWNER_IS_UNKNOWN 0x00000000 #define VC_OWNER_IS_ATMLANE 0x00000004 // NdisClCreateVc done #define VC_OWNER_IS_CALLMGR 0x00000008 // CreateVcHandler done // Bits 4-7 for Call State #define VC_CALL_STATE_MASK 0x000000F0 #define VC_CALL_STATE_IDLE 0x00000000 #define VC_CALL_STATE_INCOMING_IN_PROGRESS 0x00000010 // Wait for CallConnected #define VC_CALL_STATE_OUTGOING_IN_PROGRESS 0x00000020 // Wait for MakeCallCmpl #define VC_CALL_STATE_ACTIVE 0x00000040 #define VC_CALL_STATE_CLOSE_IN_PROGRESS 0x00000080 // Wait for CloseCallCmpl // Bits 8-9 to indicate waiting for LANE Ready state #define VC_READY_STATE_MASK 0x00000300 #define VC_READY_WAIT 0x00000100 #define VC_READY_INDICATED 0x00000200 // Bit 10 to indicate whether we are closing this VC #define VC_CLOSE_STATE_MASK 0x00000400 #define VC_CLOSE_STATE_CLOSING 0x00000400 // Bit 12 to indicate whether we have seen an incoming close #define VC_SEEN_INCOMING_CLOSE 0x00001000 // // Definitions for LaneType // #define VC_LANE_TYPE_UNKNOWN 0 #define VC_LANE_TYPE_CONFIG_DIRECT 1 // LECS Connection (bidirectional) #define VC_LANE_TYPE_CONTROL_DIRECT 2 // LES Connection (bidirectional) #define VC_LANE_TYPE_CONTROL_DISTRIBUTE 3 // LES Connection (uni,incoming) #define VC_LANE_TYPE_DATA_DIRECT 4 // LEC Connection (bidirectional) #define VC_LANE_TYPE_MULTI_SEND 5 // BUS Connection (bidirectional) #define VC_LANE_TYPE_MULTI_FORWARD 6 // BUS Connection (uni,incoming) // // ------------------------ ELAN Event Object ------------------ // typedef struct _ATMLANE_EVENT { ULONG Event; // Latest state-related event NDIS_STATUS EventStatus; // Status related to current event LIST_ENTRY Link; // event queue link } ATMLANE_EVENT, *PATMLANE_EVENT; // // ------------------------ ELAN Delayed Event Object ---------- // typedef struct _ATMLANE_DELAYED_EVENT { struct _ATMLANE_EVENT DelayedEvent; // event info struct _ATMLANE_ELAN * pElan; // target ELAN for this event NDIS_TIMER DelayTimer; // To implement the delay } ATMLANE_DELAYED_EVENT, *PATMLANE_DELAYED_EVENT; // // ------------------------ ELAN Object ------------------------ // // // ELAN object represents an ELAN instance and it's // corresponding virtual miniport adapter. // typedef struct _ATMLANE_ELAN { #if DBG ULONG atmlane_elan_sig; #endif // DBG LIST_ENTRY Link; // for adapter's elan list ATMLANE_LOCK ElanLock; // Mutex for elan struct ATMLANE_BLOCK Block; ULONG RefCount; // references to this elan ULONG AdminState; // Desired state of this elan ULONG State; // (Actual) State of this elan LIST_ENTRY EventQueue; // Event queue NDIS_WORK_ITEM EventWorkItem; // For event handling ULONG RetriesLeft; // For retry handling ATMLANE_TIMER Timer; // Timer for svr call & request timeouts NDIS_WORK_ITEM NdisWorkItem; // For scheduling a passive-level thread ULONG Flags; // Misc state information PATMLANE_DELAYED_EVENT pDelayedEvent; // Event to be queued in a while // // ------ Adapter related ---- // struct _ATMLANE_ADAPTER * pAdapter; // back pointer to adapter parent NDIS_HANDLE NdisAdapterHandle; // cached adapter handle // // ------ Call Manager related ---- // NDIS_HANDLE NdisAfHandle; // handle to call manager ULONG AtmInterfaceUp; // The ATM interface is considered // "up" after ILMI addr reg is over ATMLANE_SAP LesSap; // Control Distribute SAP ATMLANE_SAP BusSap; // Multicast Forward SAP ATMLANE_SAP DataSap; // Data Direct SAP ULONG SapsRegistered; // Number of Saps registered ATMLANE_BLOCK AfBlock; // Used to block shutdown while // AF open is in progress // // ------ Virtual Miniport related ---- // NDIS_HANDLE MiniportAdapterHandle;// Virtual Miniport NDIS handle NDIS_STRING CfgDeviceName; // Miniport netcard driver name ULONG CurLookAhead; // Current established lookahead size ULONG CurPacketFilter; // Current packet filter bits ULONG FramesXmitGood; ULONG FramesRecvGood; ATMLANE_BLOCK InitBlock; // Used to block while IMInit // is in progress // // ------ Timer data ---- // ATMLANE_TIMER_LIST TimerList[ALT_CLASS_MAX]; ATMLANE_LOCK TimerLock; // Mutex for timer structures // // ----- LECS Configuration Parameters ---- // BOOLEAN CfgUseLecs; BOOLEAN CfgDiscoverLecs; ATM_ADDRESS CfgLecsAddress; // // ----- ELAN Configuration Parameters ---- // NDIS_STRING CfgBindName; NDIS_STRING CfgElanName; ULONG CfgLanType; ULONG CfgMaxFrameSizeCode; ATM_ADDRESS CfgLesAddress; // // ----- ELAN Run-Time Parameters ---- // ULONG ElanNumber; // logical Elan number ATM_ADDRESS AtmAddress; // (C1) - LE Client's ATM Address UCHAR LanType; // (C2) - LAN Type UCHAR MaxFrameSizeCode; // (C3) - Maximum Data Frame Size Code ULONG MaxFrameSize; // - Maximum Data Frame Size Value USHORT LecId; // (C14) - LE Client Identifier UCHAR ElanName[LANE_ELANNAME_SIZE_MAX]; // (C5) - ELAN Name UCHAR ElanNameSize; // Size of above MAC_ADDRESS MacAddressEth; // (C6) - Elan's MAC Address (Eth/802.3 format) MAC_ADDRESS MacAddressTr; // Elan's MAC Address (802.5 format) ULONG ControlTimeout; // (C7) - Control Time-out ATM_ADDRESS LesAddress; // (C9) - LE Server ATM Address ULONG MaxUnkFrameCount; // (C10) - Maximum Unknown Frame Count ULONG MaxUnkFrameTime; // (C11) - Maximum Unknown Frame Time ULONG LimitTime; // Precalculated values for ULONG IncrTime; // limiting bus traffic ULONG VccTimeout; // (C12) - VCC Time-out Period ULONG MaxRetryCount; // (C13) - Maximum Retry Count MAC_ADDRESS McastAddrs[MCAST_LIST_SIZE]; // (C15) - Multicast MAC Addresses ULONG McastAddrCount; // Number of above ULONG AgingTime; // (C17) - Aging Time ULONG ForwardDelayTime; // (C18) - Forward Delay Time ULONG TopologyChange; // (C19) - Topology Change ULONG ArpResponseTime; // (C20) - Expected LE_ARP Response Time ULONG FlushTimeout; // (C21) - Flush Time-out ULONG PathSwitchingDelay; // (C22) - Path Switching Delay ULONG LocalSegmentId; // (C23) - Local Segment ID ULONG McastSendVcType; // (C24) - Mcast Send VCC Type (ignored) ULONG McastSendVcAvgRate; // (C25) - Mcast Send Avg Rate (ignored) ULONG McastSendVcPeakRate;// (C26) - Mcast Send Peak Rate (ignored) ULONG ConnComplTimer; // (C28) - Connection Completion Timer ULONG TransactionId; // LANE Control Frame Tid ATM_ADDRESS LecsAddress; // LECS ATM Address ATM_ADDRESS BusAddress; // BUS ATM Address ULONG MinFrameSize; // Minimum LANE frame size NDIS_STATUS LastEventCode; // Used to avoid repeated event logging // // ----- Buffer Management: Header buffers and Protocol buffers ---- // ATMLANE_LOCK HeaderBufferLock; // Mutex for header buffers PNDIS_BUFFER HeaderBufList; // Free list of header buffers ULONG HeaderBufSize; // Size of each header buffer ULONG RealHeaderBufSize; // Above size rounded up to mult of 4 ULONG MaxHeaderBufs; // Max header buffers we can allocate ULONG CurHeaderBufs; // Current header buffers allocated PATMLANE_BUFFER_TRACKER pHeaderTrkList; // Info about allocated header buffers PNDIS_BUFFER PadBufList; ULONG PadBufSize; // Size of pad buffers ULONG MaxPadBufs; // Max pad buffers we can allocate ULONG CurPadBufs; // Current pad buffers allocated PATMLANE_BUFFER_TRACKER pPadTrkList; // Info about allocated pad buffers NDIS_HANDLE ProtocolPacketPool; // Handle for Packet pool NDIS_HANDLE ProtocolBufferPool; // Handle for Buffer pool PUCHAR ProtocolBufList; // Free list of protocol buffers (for // LANE control packets) PUCHAR ProtocolBufTracker; // Start of chunk of memory used for // the above. ULONG ProtocolBufSize; // Size of each protocol buffer ULONG MaxProtocolBufs; // Number of protocol buffers NDIS_HANDLE TransmitPacketPool; // Handle for transmit packet pool NDIS_HANDLE ReceivePacketPool; // Handle for receive packet pool NDIS_HANDLE ReceiveBufferPool; // Handle for receive buffer pool #if PKT_HDR_COUNTS ULONG XmitPktCount; ULONG RecvPktCount; ULONG ProtPktCount; #endif // PKT_HDR_COUNTS #if SENDLIST PNDIS_PACKET pSendList; NDIS_SPIN_LOCK SendListLock; #endif // SENDLIST // // ----- MAC Entry Cache ----- (C16) // PATMLANE_MAC_ENTRY * pMacTable; // (C16) LE_ARP Cache ULONG NumMacEntries; // Count of entries in cache ATMLANE_LOCK MacTableLock; // Mutex for above table // // ----- Connection Cache ----- // PATMLANE_ATM_ENTRY pLecsAtmEntry; // LE Configuration Server PATMLANE_ATM_ENTRY pLesAtmEntry; // LAN Emulation Server PATMLANE_ATM_ENTRY pBusAtmEntry; // Broadcast & Unknown Server PATMLANE_ATM_ENTRY pAtmEntryList; // List of all ATM Entries ULONG NumAtmEntries; // Count of entries ATMLANE_LOCK AtmEntryListLock; // Mutex for above list } ATMLANE_ELAN, *PATMLANE_ELAN; #if DBG #define atmlane_elan_signature 'LELA' #endif // // NULL pointer to ATMLANE ELAN // #define NULL_PATMLANE_ELAN ((PATMLANE_ELAN)NULL) // // Definitions of ATMLANE ELAN States. // #define ELAN_STATE_ALLOCATED 0 #define ELAN_STATE_INIT 1 #define ELAN_STATE_LECS_CONNECT_ILMI 2 #define ELAN_STATE_LECS_CONNECT_WKA 3 #define ELAN_STATE_LECS_CONNECT_PVC 4 #define ELAN_STATE_LECS_CONNECT_CFG 5 #define ELAN_STATE_CONFIGURE 6 #define ELAN_STATE_LES_CONNECT 7 #define ELAN_STATE_JOIN 8 #define ELAN_STATE_BUS_CONNECT 9 #define ELAN_STATE_OPERATIONAL 10 #define ELAN_STATE_SHUTDOWN 11 // // Definitions of ATMLANE Elan Flags // // // Bits 0 thru 3 define the current LECS Connect attempt // #define ELAN_LECS_MASK 0x0000000f #define ELAN_LECS_ILMI 0x00000001 #define ELAN_LECS_WKA 0x00000002 #define ELAN_LECS_PVC 0x00000004 #define ELAN_LECS_CFG 0x00000008 // // Bit 4 & 5 define the virtual miniport state // #define ELAN_MINIPORT_INITIALIZED 0x00000010 #define ELAN_MINIPORT_OPERATIONAL 0x00000020 // // Bit 6 defines event work item scheduling state // #define ELAN_EVENT_WORK_ITEM_SET 0x00000040 // // Bit 7 specifies if we want to restart this ELAN // #define ELAN_NEEDS_RESTART 0x00000080 #define ELAN_SAW_AF_CLOSE 0x00000100 // // Bit 9 defines whether there is a pending IMInitializeDeviceInstance // on the ELAN, i.e. we expect to see a MiniportInitialize. // #define ELAN_MINIPORT_INIT_PENDING 0x00000200 // // Bit 10 defines whether we are in the process of opening // an AF handle. // #define ELAN_OPENING_AF 0x00000400 // // This bit indicates whether this ELAN is being deallocated. // #define ELAN_DEALLOCATING 0x80000000 // // Elan events // #define ELAN_EVENT_START 1 #define ELAN_EVENT_NEW_ATM_ADDRESS 2 #define ELAN_EVENT_GOT_ILMI_LECS_ADDR 3 #define ELAN_EVENT_SVR_CALL_COMPLETE 4 #define ELAN_EVENT_CONFIGURE_RESPONSE 5 #define ELAN_EVENT_SAPS_REGISTERED 6 #define ELAN_EVENT_JOIN_RESPONSE 7 #define ELAN_EVENT_ARP_RESPONSE 8 #define ELAN_EVENT_BUS_CALL_CLOSED 9 #define ELAN_EVENT_LES_CALL_CLOSED 10 #define ELAN_EVENT_LECS_CALL_CLOSED 11 #define ELAN_EVENT_RESTART 12 #define ELAN_EVENT_STOP 13 // // Event status codes - use NDIS status codes // but make up one for timeout // #define NDIS_STATUS_TIMEOUT ((NDIS_STATUS)STATUS_TIMEOUT) // // ------------------------ ElanName Object ------------------------ // typedef struct _ATMLANE_NAME { struct _ATMLANE_NAME * pNext; NDIS_STRING Name; } ATMLANE_NAME, *PATMLANE_NAME; // // ------------------------ Adapter Object ------------------------ // // // Adapter object represents an actual ATM adapter. // typedef struct _ATMLANE_ADAPTER { #if DBG ULONG atmlane_adapter_sig; #endif // // Reference count and lock to protect this object. // ULONG RefCount; ATMLANE_LOCK AdapterLock; // // State // ULONG Flags; // // Block data structure for blocking threads during adapter requests. // ATMLANE_BLOCK Block; // // Link for global adapter list. // LIST_ENTRY Link; // // Adapter handle and such. // NDIS_HANDLE NdisAdapterHandle; NDIS_HANDLE BindContext; NDIS_HANDLE UnbindContext; // // Protocol configuration handle and string for opening it. // NDIS_STRING ConfigString; // // Adapter parameters acquired from miniport // MAC_ADDRESS MacAddress; ULONG MaxAAL5PacketSize; NDIS_CO_LINK_SPEED LinkSpeed; // // Adapter configuration parameters. // These only exist on Memphis/Win98. // BOOLEAN RunningOnMemphis; NDIS_STRING CfgUpperBindings; PATMLANE_NAME UpperBindingsList; NDIS_STRING CfgElanName; PATMLANE_NAME ElanNameList; // // List of created ELANs. // LIST_ENTRY ElanList; UINT ElanCount; // // Used to block Unbind while bootstrapping ELANs. // ATMLANE_BLOCK UnbindBlock; // // Used to block AF notification while querying the ATM adapter. // ATMLANE_BLOCK OpenBlock; // // Name of device. Used to protect against multiple calls to our // BindAdapter handler for the same device. // NDIS_STRING DeviceName; } ATMLANE_ADAPTER, *PATMLANE_ADAPTER; #if DBG #define atmlane_adapter_signature 'DALA' #endif // // NULL pointer to ATMLANE Adapter // #define NULL_PATMLANE_ADAPTER ((PATMLANE_ADAPTER)NULL) // // Definitions for Adapter State Flags // #define ADAPTER_FLAGS_AF_NOTIFIED 0x00000001 #define ADAPTER_FLAGS_UNBINDING 0x00000002 #define ADAPTER_FLAGS_UNBIND_COMPLETE_PENDING 0x00000004 #define ADAPTER_FLAGS_CLOSE_IN_PROGRESS 0x00000008 #define ADAPTER_FLAGS_BOOTSTRAP_IN_PROGRESS 0x00000010 #define ADAPTER_FLAGS_OPEN_IN_PROGRESS 0x00000100 #define ADAPTER_FLAGS_DEALLOCATING 0x80000000 #endif // __ATMLANE_ATMLANE_H