/*++ Copyright (c) 1992-1996 Microsoft Corporation Module Name: protos.h Abstract: This file contains the function proto-types and macros. Author: Jameel Hyder (jameelh@microsoft.com) July 1996 Environment: Kernel mode Revision History: --*/ #ifndef _PROTOS_ #define _PROTOS_ #define POOL_TAG_PG 'AprA' #define POOL_TAG_VC 'VprA' #define POOL_TAG_INTF 'IprA' #define POOL_TAG_ADDR 'AprA' #define POOL_TAG_BUF 'BprA' #define POOL_TAG_REQ 'RprA' #define POOL_TAG_SAP 'SprA' #define POOL_TAG_BLK 'KprA' #define POOL_TAG_MARS 'MprA' #if DBG extern PVOID ArpSAllocMem( IN UINT Size, IN ULONG FileLine, IN ULONG Tag, IN BOOLEAN Paged ); extern VOID ArpSFreeMem( IN PVOID pMem, IN ULONG FileLine ); #define ALLOC_NP_MEM(_size, _tag) ArpSAllocMem(_size, __LINE__ | _FILENUM_, _tag, FALSE) #define ALLOC_PG_MEM(_size) ArpSAllocMem(_size, __LINE__ | _FILENUM_, POOL_TAG_PG, TRUE) #define FREE_MEM(_p) ArpSFreeMem(_p, __LINE__ | _FILENUM_) #else #define ALLOC_NP_MEM(_size, _tag) ExAllocatePoolWithTag(NonPagedPool, _size, _tag) #define ALLOC_PG_MEM(_size) ExAllocatePoolWithTag(PagedPool, _size, POOL_TAG_PG) #define FREE_MEM(_p) ExFreePool(_p) #endif #define ZERO_MEM(_p, _size) RtlZeroMemory(_p, _size) #define COPY_MEM(_d, _s, _size) RtlCopyMemory(_d, _s, _size) #define MOVE_MEM(_d, _s, _size) RtlMoveMemory(_d, _s, _size) #define COMP_MEM(_p1, _p2, _size_) RtlEqualMemory(_p1, _p2, _size_) #define INITIALIZE_SPIN_LOCK(_l) KeInitializeSpinLock(_l) #define ACQUIRE_SPIN_LOCK(_l, _i) KeAcquireSpinLock(_l, _i) #define ACQUIRE_SPIN_LOCK_DPC(_l) KeAcquireSpinLockAtDpcLevel(_l) #define RELEASE_SPIN_LOCK(_l, _i) KeReleaseSpinLock(_l, _i) #define RELEASE_SPIN_LOCK_DPC(_l) KeReleaseSpinLockFromDpcLevel(_l) #define INITIALIZE_MUTEX(_m_) KeInitializeMutex(_m_, 0xFFFF) #define RELEASE_MUTEX(_m_) KeReleaseMutex(_m_, FALSE); #define WAIT_FOR_OBJECT(_S_, _O_, _TO_) (_S_) = KeWaitForSingleObject(_O_, \ Executive, \ KernelMode, \ TRUE, \ _TO_) \ #define INIT_EVENT(_pEv) NdisInitializeEvent(_pEv) #define SET_EVENT(_pEv) NdisSetEvent(_pEv) #define WAIT_FOR_EVENT(_pEv) NdisWaitEvent(_pEv, 0) extern NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); extern NTSTATUS ArpSDispatch( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); extern NTSTATUS ArpSHandleIoctlRequest( IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpSp ); extern NTSTATUS ArpSEnumerateInterfaces( IN PUCHAR pBuffer, IN OUT PULONG_PTR pSize ); extern NTSTATUS ArpSFlushArpCache( IN PINTF pIntF ); extern NTSTATUS ArpSQueryOrAddArpEntry( IN PINTF pIntF, IN OUT PIOCTL_QA_ENTRY pQaBuf, IN OPERATION Operation ); extern NTSTATUS ArpSQueryArpCache( IN PINTF pIntF, IN PUCHAR pBuf, IN OUT PULONG_PTR pSize ); extern NTSTATUS ArpSQueryArpStats( IN PINTF pIntF, OUT PARP_SERVER_STATISTICS pArpStats ); extern NTSTATUS ArpSQueryMarsCache( IN PINTF pIntF, IN PUCHAR pBuf, IN OUT PULONG_PTR pSize ); extern NTSTATUS ArpSQueryMarsStats( IN PINTF pIntF, OUT PMARS_SERVER_STATISTICS pMarsStats ); extern VOID ArpSResetStats( IN PINTF pIntF ); extern VOID ArpSUnload( IN PDRIVER_OBJECT DriverObject ); extern VOID ArpSShutDown( VOID ); extern NDIS_STATUS ArpSStopInterface( IN PINTF pIntF, IN BOOLEAN bCloseAdapter ); extern NDIS_STATUS ArpSPnPEventHandler( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent ); extern PINTF ArpSCreateIntF( IN PNDIS_STRING DeviceName, IN PNDIS_STRING ConfigString, IN NDIS_HANDLE BindingContext ); extern VOID ArpSReqThread( IN PVOID Context ); extern VOID ArpSTimerThread( IN PVOID Context ); extern NTSTATUS ArpSReadGlobalConfiguration( IN PUNICODE_STRING RegistryPath ); extern NDIS_STATUS ArpSReadAdapterConfigFromRegistry( IN PINTF pIntF, OUT PATMARPS_CONFIG pConfig ); extern NDIS_STATUS ArpSReadAdapterConfiguration( IN PINTF pIntF ); extern VOID ArpSConvertStringToIpPair( OUT PNDIS_STATUS pStatus, IN PNDIS_STRING pString, IN PMCS_ENTRY pMcsEntry ); extern BOOLEAN IPConvertStringToAddress( IN PWCHAR AddressString, OUT PULONG IpAddress ); extern VOID ArpSReadArpCache( IN PINTF pIntF ); extern BOOLEAN ArpSWriteArpCache( IN PINTF pIntF, IN PTIMER Timer, IN BOOLEAN TimerShuttingDown ); extern VOID MarsReqThread( IN PVOID Context ); extern VOID MarsHandleRequest( IN PINTF pIntF, IN PARP_VC Vc, IN PMARS_HEADER Header, IN PNDIS_PACKET Packet ); extern VOID MarsHandleJoin( IN PINTF pIntF, IN PARP_VC Vc, IN PMARS_HEADER Header, IN PNDIS_PACKET Packet ); extern VOID MarsHandleLeave( IN PINTF pIntF, IN PARP_VC Vc, IN PMARS_HEADER Header, IN PNDIS_PACKET Packet ); extern PCLUSTER_MEMBER MarsLookupClusterMember( IN PINTF pIntF, IN PHW_ADDR pHwAddr ); extern PCLUSTER_MEMBER MarsCreateClusterMember( IN PINTF pIntF, IN PHW_ADDR pHwAddr ); extern VOID MarsDeleteClusterMember( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember ); extern PMARS_ENTRY MarsLookupMarsEntry( IN PINTF pIntF, IN IPADDR GrpAddr, IN BOOLEAN bCreateNew ); extern BOOLEAN MarsIsAddressMcsServed( IN PINTF pIntF, IN IPADDR IPAddress ); extern VOID MarsPunchHoles( IN PMCAST_ADDR_PAIR pGrpAddrRange, IN PGROUP_MEMBER pGroupList, IN PINTF pIntF, IN IPADDR UNALIGNED * pOutBuf OPTIONAL, OUT PUSHORT pMinMaxCount, OUT BOOLEAN * pAnyHolesPunched ); extern BOOLEAN MarsAddClusterMemberToGroups( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember, IN PMCAST_ADDR_PAIR pGrpAddrRange, IN PNDIS_PACKET Packet, IN PMARS_JOIN_LEAVE JHdr, IN UINT Length, OUT PNDIS_PACKET * ppClusterPacket ); extern VOID MarsUnlinkAllGroupsOnClusterMember( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember ); extern BOOLEAN MarsDelClusterMemberFromGroups( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember, IN PMCAST_ADDR_PAIR pGrpAddrRange, IN PNDIS_PACKET Packet, IN PMARS_JOIN_LEAVE LHdr, IN UINT Length, OUT PNDIS_PACKET * ppClusterPacket ); extern PNDIS_PACKET MarsAllocControlPacket( IN PINTF pIntF, IN ULONG PacketLength, OUT PUCHAR * pPacketStart ); extern VOID MarsFreePacket( IN PNDIS_PACKET Packet ); extern PNDIS_PACKET MarsAllocPacketHdrCopy( IN PNDIS_PACKET Packet ); extern VOID MarsSendOnClusterControlVc( IN PINTF pIntF, IN PNDIS_PACKET Packet OPTIONAL ); extern VOID MarsFreePacketsQueuedForClusterControlVc( IN PINTF pIntF ); extern BOOLEAN MarsDelMemberFromClusterControlVc( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember, IN BOOLEAN fIfLocked, IN KIRQL OldIrql OPTIONAL ); extern VOID MarsAddMemberToClusterControlVc( IN PINTF pIntF, IN PCLUSTER_MEMBER pMember ); extern PCO_CALL_PARAMETERS MarsPrepareCallParameters( IN PINTF pIntF, IN PHW_ADDR pHwAddr, IN BOOLEAN IsMakeCall ); extern BOOLEAN MarsSendRedirect( IN PINTF pIntF, IN PTIMER Timer, IN BOOLEAN TimerShuttingDown ); extern VOID MarsAbortAllMembers( IN PINTF pIntF ); extern VOID MarsStopInterface( IN PINTF pIntF ); extern VOID MarsDumpPacket( IN PUCHAR Packet, IN UINT PktLen ); extern VOID MarsDumpIpAddr( IN IPADDR IpAddr, IN PCHAR String ); extern VOID MarsDumpAtmAddr( IN PATM_ADDRESS AtmAddr, IN PCHAR String ); extern VOID MarsDumpMap( IN PCHAR String, IN IPADDR IpAddr, IN PATM_ADDRESS AtmAddr ); extern NTSTATUS ArpSInitializeNdis( VOID ); extern VOID ArpSDeinitializeNdis( VOID ); extern VOID ArpSOpenAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus ); extern VOID ArpSCloseAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status ); extern VOID ArpSStatus( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ); extern VOID ArpSReceiveComplete( IN NDIS_HANDLE ProtocolBindingContext ); extern VOID ArpSStatusComplete( IN NDIS_HANDLE ProtocolBindingContext ); VOID ArpSQueryAdapter( IN PINTF pIntF ); extern VOID ArpSSendNdisRequest( IN PINTF pIntF, IN NDIS_OID Oid, IN PVOID pBuffer, IN ULONG BufferLength ); extern VOID ArpSRequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST pRequest, IN NDIS_STATUS Status ); extern VOID ArpSBindAdapter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 ); extern VOID ArpSUnbindAdapter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE UnbindContext ); extern VOID ArpSCoSendComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet ); extern VOID ArpSCoStatus( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ); extern NDIS_STATUS ArpSCoRequest( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest ); extern VOID ArpSCoRequestComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN PNDIS_REQUEST NdisRequest ); extern VOID ArpSCoAfRegisterNotify( IN NDIS_HANDLE ProtocolBindingContext, IN PCO_ADDRESS_FAMILY AddressFamily ); extern NDIS_STATUS ArpSCreateVc( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE ProtocolVcContext ); extern NDIS_STATUS ArpSDeleteVc( IN NDIS_HANDLE ProtocolVcContext ); extern VOID ArpSOpenAfComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisAfHandle ); extern VOID ArpSCloseAfComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext ); extern VOID ArpSRegisterSap( IN PINTF pIntF ); extern VOID ArpSRegisterSapComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext, IN PCO_SAP Sap, IN NDIS_HANDLE NdisSapHandle ); extern VOID ArpSDeregisterSapComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext ); extern VOID ArpSMakeCallComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE NdisPartyHandle OPTIONAL, IN PCO_CALL_PARAMETERS CallParameters ); extern VOID ArpSCloseCallComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL ); extern VOID ArpSAddPartyComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext, IN NDIS_HANDLE NdisPartyHandle, IN PCO_CALL_PARAMETERS CallParameters ); extern VOID ArpSDropPartyComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext ); extern NDIS_STATUS ArpSIncomingCall( IN NDIS_HANDLE ProtocolSapContext, IN NDIS_HANDLE ProtocolVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters ); extern VOID ArpSIncomingDropParty( IN NDIS_STATUS DropStatus, IN NDIS_HANDLE ProtocolPartyContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL ); extern VOID ArpSCallConnected( IN NDIS_HANDLE ProtocolVcContext ); extern VOID ArpSIncomingCloseCall( IN NDIS_STATUS CloseStatus, IN NDIS_HANDLE ProtocolVcContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL ); extern VOID ArpSIncomingCallQoSChange( IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters ); extern VOID ArpSInitiateCloseCall( IN PARP_VC Vc ); extern UINT ArpSHandleArpRequest( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet ); extern PARP_ENTRY ArpSLookupEntryByIpAddr( IN PINTF pIntF, IN IPADDR IpAddr ); extern PARP_ENTRY ArpSLookupEntryByAtmAddr( IN PINTF pIntF, IN PATM_ADDRESS Address, IN PATM_ADDRESS SubAddress OPTIONAL ); extern PARP_ENTRY ArpSAddArpEntry( IN PINTF pIntF, IN IPADDR IpAddr, IN PATM_ADDRESS Address, IN PATM_ADDRESS SubAddress OPTIONAL, IN PARP_VC Vc OPTIONAL ); extern PARP_ENTRY ArpSAddArpEntryFromDisk( IN PINTF pIntF, IN PDISK_ENTRY pDiskEntry ); extern VOID ArpSUpdateArpEntry( IN PINTF pIntF, IN PARP_ENTRY ArpEntry, IN IPADDR IpAddr, IN PHW_ADDR HwAddr, IN PARP_VC Vc ); extern VOID ArpSBuildArpReply( IN PINTF pIntF, IN PARP_ENTRY ArpEntry, IN PARPS_HEADER Header, IN PNDIS_PACKET Pkt ); extern BOOLEAN ArpSAgeEntry( IN PINTF pIntF, IN PTIMER Timer, IN BOOLEAN TimerShuttingDown ); extern BOOLEAN ArpSDeleteIntFAddresses( IN PINTF pIntF, IN INT NumAddresses, IN PATM_ADDRESS AddrList ); extern VOID ArpSQueryAndSetAddresses( IN PINTF pIntF ); VOID ArpSValidateAndSetRegdAddresses( IN PINTF pIntF, IN KIRQL OldIrql ); VOID ArpSMakeRegAddrCallComplete( IN NDIS_STATUS Status, IN PREG_ADDR_CTXT pRegAddrCtxt ); VOID ArpSCloseRegAddrCallComplete( IN NDIS_STATUS Status, IN PREG_ADDR_CTXT pRegAddrCtxt ); VOID ArpSIncomingRegAddrCloseCall( IN NDIS_STATUS Status, IN PREG_ADDR_CTXT pRegAddrCtxt ); VOID ArpSValidateOneRegdAddress( IN PINTF pIntF, IN KIRQL OldIrql ); VOID ArpSSetupValidationCallParams( IN PREG_ADDR_CTXT pRegAddrCtxt, // LOCKIN LOCKOUT (pIntF lock) IN PATM_ADDRESS pAtmAddr ); VOID ArpSUnlinkRegAddrCtxt( PINTF pIntF, // LOCKIN NOLOCKOUT KIRQL OldIrql ); VOID ArpSLogFailedRegistration( PATM_ADDRESS pAtmAddress ); extern BOOLEAN ArpSReferenceIntF( IN PINTF pIntF ); extern PINTF ArpSReferenceIntFByName( IN PINTERFACE_NAME pInterface ); extern VOID ArpSDereferenceIntF( IN PINTF pIntF ); extern BOOLEAN ArpSReferenceVc( IN PARP_VC Vc, IN BOOLEAN bSendRef ); extern VOID ArpSDereferenceVc( IN PARP_VC Vc, IN BOOLEAN KillArpEntry, IN BOOLEAN bSendComplete ); extern VOID ArpSSleep( IN UINT TimeInMs ); extern VOID ArpSFreeGlobalData( VOID ); extern VOID ArpSTimerCancel( IN PTIMER pTimerList ); extern VOID ArpSTimerEnqueue( IN PINTF pIntF, IN PTIMER pTimer ); extern PVOID ArpSAllocBlock( IN PINTF pIntF, IN ENTRY_TYPE EntryType ); extern VOID ArpSFreeBlock( IN PVOID pBlock ); BOOLEAN ArpSValidAtmAddress( IN PATM_ADDRESS AtmAddr, IN UINT MaxSize ); VOID DeregisterAllAddresses( IN PINTF pIntF ); BOOLEAN MarsIsValidClusterMember( PINTF pIntF, PCLUSTER_MEMBER pPossibleMember ); VOID ArpSTryCloseAdapter( IN PINTF pIntF // NOLOCKIN LOLOCKOUT ); #if DBG extern VOID ArpSDumpPacket( IN PUCHAR Packet, IN UINT PktLen ); extern VOID ArpSDumpAddress( IN IPADDR IpAddr, IN PHW_ADDR HwAddr, IN PCHAR String ); extern VOID ArpSDumpIpAddr( IN IPADDR IpAddr, IN PCHAR String ); extern VOID ArpSDumpAtmAddr( IN PATM_ADDRESS AtmAddr, IN PCHAR String ); #else #define ArpSDumpPacket(_Packet, _PktLen) #define ArpSDumpAddress(_IpAddr, _HwAddr, _String) #define ArpSDumpIpAddr(_IpAddr, _String) #define ArpSDumpAtmAddr(_AtmAddr, _String) #endif /* * The following macros deal with on-the-wire integer and long values * * On the wire format is big-endian i.e. a long value of 0x01020304 is * represented as 01 02 03 04. Similarly an int value of 0x0102 is * represented as 01 02. * * The host format is not assumed since it will vary from processor to * processor. */ #pragma alloc_text(INIT, DriverEntry) #pragma alloc_text(INIT, ArpSReadGlobalConfiguration) #pragma alloc_text(INIT, ArpSInitializeNdis) #pragma alloc_text(PAGE, ArpSReadArpCache) #pragma alloc_text(PAGE, ArpSWriteArpCache) #pragma alloc_text(PAGE, ArpSSleep) #pragma alloc_text(PAGE, ArpSReqThread) #pragma alloc_text(PAGE, ArpSTimerThread) #pragma alloc_text(PAGE, ArpSDispatch) #pragma alloc_text(PAGE, ArpSLookupEntryByIpAddr) #pragma alloc_text(PAGE, ArpSLookupEntryByAtmAddr) #pragma alloc_text(PAGE, ArpSAddArpEntry) #pragma alloc_text(PAGE, ArpSAddArpEntryFromDisk) #pragma alloc_text(PAGE, ArpSCreateIntF) #pragma alloc_text(PAGE, MarsReqThread) #endif // _PROTOS_