/*++ Copyright (c) 1992-1996 Microsoft Corporation Module Name: intf.h Abstract: This file contains the per-adapter (LIS) interface definition. Author: Jameel Hyder (jameelh@microsoft.com) July 1996 Environment: Kernel mode Revision History: --*/ #ifndef _INTF_ #define _INTF_ #define SERVICE_NAME L"AtmArpS" #define NUM_ARPS_DESC 128 #define NUM_MARS_DESC 128 #define MAX_DESC_MULTIPLE 10 #define ARP_TABLE_SIZE 64 // Keep this as a power of 2. The ARP_HASH macro relies on it. #define MARS_TABLE_SIZE 32 // Keep this as a power of 2. The MARS_HASH macro relies on it. #define ARP_HASH(_ipaddr) ((((PUCHAR)&(_ipaddr))[3]) & (ARP_TABLE_SIZE - 1)) #define MARS_HASH(_ipaddr) ((((PUCHAR)&(_ipaddr))[3]) & (MARS_TABLE_SIZE - 1)) typedef struct _ArpVc ARP_VC, *PARP_VC; typedef struct _REG_ADDR_CTXT REG_ADDR_CTXT, *PREG_ADDR_CTXT; // // The protocol reserved area in the ndis packets. // typedef struct { LIST_ENTRY ReqList; // For queuing the packet into the KQUEUE SINGLE_LIST_ENTRY FreeList; // For queuing the packet into the SLIST PARP_VC Vc; // Owning Vc in case of queued packet USHORT Flags; // Misc. other information USHORT PktLen; // Length of incoming packet union { PNDIS_PACKET OriginalPkt;// When a packet is forwarded by the MARS PUCHAR PacketStart;// For MARS Control packets }; } PROTOCOL_RESD, *PPROTOCOL_RESD; #define RESD_FLAG_MARS 0x0001 // Indicates that the packet is to be processed by MARS #define RESD_FLAG_MARS_PKT 0x0002 // Indicates that the packet is from the MARS pool #define RESD_FLAG_FREEBUF 0x0004 // Indicates that the buffer and associated memory must be // freed upon completion of the send. #define RESD_FLAG_KILL_CCVC 0x0010 // This isn't part of a packet. This is used // to queue a request to abort ClusterControlVc. #define RESD_FROM_PKT(_Pkt) (PPROTOCOL_RESD)((_Pkt)->ProtocolReserved) typedef UCHAR ATM_ADDR_TYPE; typedef struct _HwAddr { ATM_ADDRESS Address; PATM_ADDRESS SubAddress; } HW_ADDR, *PHW_ADDR; #define COMP_ATM_ADDR(_a1_, _a2_) (((_a1_)->AddressType == (_a2_)->AddressType) && \ ((_a1_)->NumberOfDigits == (_a2_)->NumberOfDigits) && \ COMP_MEM((_a1_)->Address, \ (_a2_)->Address, \ (_a1_)->NumberOfDigits)) #define COPY_ATM_ADDR(_d_, _s_) \ { \ (_d_)->AddressType = (_s_)->AddressType; \ (_d_)->NumberOfDigits = (_s_)->NumberOfDigits; \ COPY_MEM((_d_)->Address, (_s_)->Address, (_s_)->NumberOfDigits); \ } #define COMP_HW_ADDR(_a1_, _a2_) (((_a1_)->Address.AddressType == (_a2_)->Address.AddressType) && \ ((_a1_)->Address.NumberOfDigits == (_a2_)->Address.NumberOfDigits) && \ COMP_MEM((_a1_)->Address.Address, \ (_a2_)->Address.Address, \ (_a1_)->Address.NumberOfDigits) && \ ((((_a1_)->SubAddress == NULL) && ((_a2_)->SubAddress == NULL)) || \ ((((_a1_)->SubAddress != NULL) && ((_a2_)->SubAddress != NULL)) && \ ((_a1_)->SubAddress->AddressType == (_a2_)->SubAddress->AddressType) &&\ ((_a1_)->SubAddress->NumberOfDigits == (_a2_)->SubAddress->NumberOfDigits) &&\ COMP_MEM((_a1_)->SubAddress->Address, \ (_a2_)->SubAddress->Address, \ (_a1_)->SubAddress->NumberOfDigits)))) \ #define COPY_HW_ADDR(_d_, _s_) \ { \ (_d_)->Address.AddressType = (_s_)->Address.AddressType; \ (_d_)->Address.NumberOfDigits = (_s_)->Address.NumberOfDigits; \ COPY_MEM((_d_)->Address.Address, (_s_)->Address.Address, (_s_)->Address.NumberOfDigits); \ if ((_s_)->SubAddress != NULL) \ { \ (_d_)->SubAddress->AddressType = (_s_)->SubAddress->AddressType; \ (_d_)->SubAddress->NumberOfDigits = (_s_)->SubAddress->NumberOfDigits; \ COPY_MEM((_d_)->SubAddress->Address, (_s_)->SubAddress->Address, (_s_)->SubAddress->NumberOfDigits);\ } \ } typedef struct _ENTRY_HDR { VOID * Next; VOID ** Prev; } ENTRY_HDR, *PENTRY_HDR; typedef struct _ArpEntry { ENTRY_HDR; HW_ADDR HwAddr; // HWADDR MUST FOLLOW ENTRY_HDR TIMER Timer; IPADDR IpAddr; PARP_VC Vc; // Pointer to the Vc (if active) UINT Age; } ARP_ENTRY, *PARP_ENTRY; #define FLUSH_TIME 60*MULTIPLIER // 60 minutes in 15s units #define ARP_AGE 20*MULTIPLIER // 20 minutes in 15s units #define REDIRECT_INTERVAL 1*MULTIPLIER // 1 minute #define ARP_BLOCK_VANILA (ENTRY_TYPE)0 #define ARP_BLOCK_SUBADDR (ENTRY_TYPE)1 #define MARS_CLUSTER_VANILA (ENTRY_TYPE)2 #define MARS_CLUSTER_SUBADDR (ENTRY_TYPE)3 #define MARS_GROUP (ENTRY_TYPE)4 #define MARS_BLOCK_ENTRY (ENTRY_TYPE)5 #define ARP_BLOCK_TYPES (ENTRY_TYPE)6 #define BLOCK_ALLOC_SIZE PAGE_SIZE typedef UINT ENTRY_TYPE; typedef struct _ArpBlock { struct _ArpBlock * Next; // Link to next struct _ArpBlock ** Prev; // Link to previous struct _IntF * IntF; // Back pointer to the interface ENTRY_TYPE EntryType; // ARP_BLOCK_XXX UINT NumFree; // # of free ArpEntries in this block PENTRY_HDR FreeHead; // Head of the list of free Arp Entries } ARP_BLOCK, *PARP_BLOCK; // // Forward declaration // typedef struct _MARS_ENTRY MARS_ENTRY, *PMARS_ENTRY; typedef struct _MARS_VC MARS_VC, *PMARS_VC; typedef struct _MARS_FLOW_SPEC MARS_FLOW_SPEC, *PMARS_FLOW_SPEC; typedef struct _CLUSTER_MEMBER CLUSTER_MEMBER, *PCLUSTER_MEMBER; typedef struct _MCS_ENTRY MCS_ENTRY, *PMCS_ENTRY; // // Flow Specifications for an ATM Connection. The structure // represents a bidirectional flow. // typedef struct _MARS_FLOW_SPEC { ULONG SendBandwidth; // Bytes/Sec ULONG SendMaxSize; // Bytes ULONG ReceiveBandwidth; // Bytes/Sec ULONG ReceiveMaxSize; // Bytes SERVICETYPE ServiceType; } MARS_FLOW_SPEC, *PMARS_FLOW_SPEC; typedef struct _IntF { struct _IntF * Next; LONG RefCount; ULONG Flags; UNICODE_STRING InterfaceName; // Name of device bound to UNICODE_STRING FriendlyName; // Descriptive name of above UNICODE_STRING FileName; // Name of file where arp entries are stored UNICODE_STRING ConfigString; // Used to access registry // // Fields relating to NDIS. // NDIS_MEDIUM SupportedMedium; // For use in NdisOpenAdapter NDIS_HANDLE NdisBindingHandle; // Handle to the binding NDIS_HANDLE NdisAfHandle; // Handle to the registered Address Family union { NDIS_HANDLE NdisSapHandle; // Handle to the registered Sap NDIS_HANDLE NdisBindContext; // Valid only during BindAdapter call }; CO_ADDRESS_FAMILY AddrFamily; // For use by NdisClOpenAddressFamily PCO_SAP Sap; // For use by NdisClRegisterSap LIST_ENTRY InactiveVcHead; // Created Vcs go here. LIST_ENTRY ActiveVcHead; // Vcs with active calls go here. #if DBG LIST_ENTRY FreeVcHead; // Freed Vcs go here - fo Debugging. #endif UCHAR SelByte; // Read as part of the configuration USHORT NumAllocedRegdAddresses; // # of registered atm addresses on this i/f USHORT NumAddressesRegd; // # of atm addresses successfully registered on this i/f ATM_ADDRESS ConfiguredAddress; // Configured address for this port UINT NumPendingDelAddresses; // Number of address pending deletion. PATM_ADDRESS RegAddresses; // Array of h/w addresses PREG_ADDR_CTXT pRegAddrCtxt; // Context used when registering // addresses. UINT NumCacheEntries; PARP_ENTRY ArpCache[ARP_TABLE_SIZE]; // The list of arp entries that we know about ULONG LastVcId; // A server created id assigned to each incoming vc PTIMER ArpTimer; // Head of the timer-list for this interface KMUTEX ArpCacheMutex; // Protects the ArpCache and the ArpTimer KEVENT TimerThreadEvent; // Signal this to kill the timer thread TIMER FlushTimer; // Used to flush arp-cache to disk TIMER BlockTimer; // Used to age-out arp blocks PKEVENT CleanupEvent; // signalling when IntF is freed PKEVENT DelAddressesEvent; // signalling when addresses are deleted PARP_BLOCK PartialArpBlocks[ARP_BLOCK_TYPES]; PARP_BLOCK UsedArpBlocks[ARP_BLOCK_TYPES]; ARP_SERVER_STATISTICS ArpStats; LARGE_INTEGER StatisticsStartTimeStamp; // // Fields used by MARS // PMARS_ENTRY MarsCache[MARS_TABLE_SIZE]; MARS_SERVER_STATISTICS MarsStats; PCLUSTER_MEMBER ClusterMembers; // List of Cluster members ULONG NumClusterMembers; // Size of above list PMCS_ENTRY pMcsList; // MCS configuration PMARS_VC ClusterControlVc; // Outgoing PMP for MARS control // and MCS data INT CCActiveParties; // Number of connected members INT CCAddingParties; // Number of AddParty()'s pending INT CCDroppingParties; // Number of DropParty()'s pending LIST_ENTRY CCPacketQueue; // Packets queued for sending on // the above VC. ULONG CSN; // ClusterSequenceNumber USHORT CMI; // ClusterMemberId ULONG MaxPacketSize; // Supported by miniport NDIS_CO_LINK_SPEED LinkSpeed; // Supported by miniport struct _MARS_FLOW_SPEC CCFlowSpec; // Flow params for ClusterControlVc TIMER MarsRedirectTimer; // For periodic MARS_REDIRECT KSPIN_LOCK Lock; } INTF, *PINTF; #define INTF_ADAPTER_OPENED 0x00000001 // Set after OpenAdapterComplete runs #define INTF_AF_OPENED 0x00000002 // Set after OpenAfComplete runs #define INTF_SAP_REGISTERED 0x00000008 // Set after RegisterSapComplete runs #define INTF_ADDRESS_VALID 0x00000010 // Set after OID_CO_ADDRESS_CHANGE is notified #define INTF_SENDING_ON_CC_VC 0x00001000 // Send in progress on ClusterControlVc #define INTF_STOPPING 0x40000000 // StopInterface in progress #define INTF_CLOSING 0x80000000 // Set after CloseAdapterComplete runs typedef struct _ArpVc { ULONG VcType; // Must be the first field in struct LIST_ENTRY List; USHORT RefCount; USHORT Flags; ULONG PendingSends; ULONG VcId; NDIS_HANDLE NdisVcHandle; PINTF IntF; ULONG MaxSendSize;// From AAL parameters PARP_ENTRY ArpEntry; HW_ADDR HwAddr; // From CallingPartyAddress } ARP_VC, *PARP_VC; #define ARPVC_ACTIVE 0x0001 #define ARPVC_CALLPROCESSING 0x0002 #define ARPVC_CLOSE_PENDING 0x4000 #define ARPVC_CLOSING 0x8000 // // VC types: // #define VC_TYPE_INCOMING ((ULONG)0) #define VC_TYPE_MARS_CC ((ULONG)1) // ClusterControlVc #define VC_TYPE_CHECK_REGADDR ((ULONG)2) // Transient vc to validate // a registered address. #define CLEANUP_DEAD_VC(_ArpEntry) \ { \ if (((_ArpEntry)->Vc != NULL) && (((_ArpEntry)->Vc->Flags & ARPVC_ACTIVE) == 0))\ { \ PARP_VC Vc = (_ArpEntry)->Vc; \ \ ArpSDereferenceVc(Vc, TRUE, FALSE); \ (_ArpEntry)->Vc = NULL; \ } \ } // // Rounded-off size of generic Q.2931 IE header // #define ROUND_OFF(_size) (((_size) + 3) & ~0x4) #define SIZEOF_Q2931_IE ROUND_OFF(sizeof(Q2931_IE)) #define SIZEOF_AAL_PARAMETERS_IE ROUND_OFF(sizeof(AAL_PARAMETERS_IE)) #define SIZEOF_ATM_TRAFFIC_DESCR_IE ROUND_OFF(sizeof(ATM_TRAFFIC_DESCRIPTOR_IE)) #define SIZEOF_ATM_BBC_IE ROUND_OFF(sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE)) #define SIZEOF_ATM_BLLI_IE ROUND_OFF(sizeof(ATM_BLLI_IE)) #define SIZEOF_ATM_QOS_IE ROUND_OFF(sizeof(ATM_QOS_CLASS_IE)) // // Total space required for Information Elements in an outgoing call. // #define REGADDR_MAKE_CALL_IE_SPACE ( \ SIZEOF_Q2931_IE + SIZEOF_AAL_PARAMETERS_IE + \ SIZEOF_Q2931_IE + SIZEOF_ATM_TRAFFIC_DESCR_IE + \ SIZEOF_Q2931_IE + SIZEOF_ATM_BBC_IE + \ SIZEOF_Q2931_IE + SIZEOF_ATM_BLLI_IE + \ SIZEOF_Q2931_IE + SIZEOF_ATM_QOS_IE ) // REG_ADDR_CTXT stores context relating to validating and registering the // list of addresses that need to be explicitly registered. "Validating" consists // of making a call to the address *before* registering, to make sure that // no one *else* has registered the same address. // See 05/14/1999 notes.txt entry for details. // typedef struct _REG_ADDR_CTXT { ULONG VcType; // Must be the first field in struct NDIS_HANDLE NdisVcHandle; // NDIS VC handle used for makeing a call // to verify that the address is unused. ULONG Flags; // One or more of the following flags. #define REGADDRCTXT_RESTART 0x0001 #define REGADDRCTXT_ABORT 0x0002 #define REGADDRCTXT_MAKECALL_PENDING 0x0004 #define REGADDRCTXT_CLOSECALL_PENDING 0x0008 // TODO/WARNING -- the above flags are currently UNUSED. UINT RegAddrIndex; // Index of the address being registered. PINTF pIntF; // Request is for setting up an ndis request to add (register) a local address. // struct { NDIS_REQUEST NdisRequest; CO_ADDRESS CoAddress; ATM_ADDRESS AtmAddress; } Request; // CallParams and the following union are for setting up the validation call. // CO_CALL_PARAMETERS CallParams; // Call manager parameters, plus extra space for the ATM-specific stuff... // union { CO_CALL_MANAGER_PARAMETERS CmParams; UCHAR Buffer[ sizeof(CO_CALL_MANAGER_PARAMETERS) + sizeof(Q2931_CALLMGR_PARAMETERS) + REGADDR_MAKE_CALL_IE_SPACE]; }; } REG_ADDR_CTXT, *PREG_ADDR_CTXT; // // Temp structure used to store information read from the registry. // typedef struct _ATMARPS_CONFIG { UCHAR SelByte; // Selector Byte USHORT NumAllocedRegdAddresses; PATM_ADDRESS RegAddresses; PMCS_ENTRY pMcsList; // MCS configuration } ATMARPS_CONFIG, *PATMARPS_CONFIG; // // Some defaults // #define DEFAULT_SEND_BANDWIDTH (ATM_USER_DATA_RATE_SONET_155*100/8) // Bytes/sec #define DEFAULT_MAX_PACKET_SIZE 9180 // Bytes // Minimum tolerated MAX_PACKET_SIZE // #define ARPS_MIN_MAX_PKT_SIZE 9180 // Bytes #endif // _INTF_