/* * Copyright (c) 1993,1994 * Texas A&M University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Texas A&M University * and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * Developers: * David K. Hess, Douglas Lee Schales, David R. Safford * * Heavily modified for Metaware HighC + GNU C 2.8+ * Gisle Vanem 1998 */ #ifndef __PCAP_NDIS_H #define __PCAP_NDIS_H #if defined (__HIGHC__) #define pascal _CC(_CALLEE_POPS_STACK & ~_REVERSE_PARMS) /* calling convention */ #define CALLBACK(foo) pascal WORD foo #define PAS_PTR(x,arg) typedef FAR WORD pascal (*x) arg #define GUARD() _inline (0x9C,0xFA) /* pushfd, cli */ #define UNGUARD() _inline (0x9D) /* popfd */ #define FAR _far #elif defined(__GNUC__) #define CALLBACK(foo) WORD foo __attribute__((stdcall)) #define PAS_PTR(x,arg) typedef WORD (*x) arg __attribute__((stdcall)) #define GUARD() __asm__ __volatile__ ("pushfd; cli") #define UNGUARD() __asm__ __volatile__ ("popfd") #define FAR #elif defined (__TURBOC__) #define CALLBACK(foo) WORD pascal foo #define PAS_PTR(x,arg) typedef WORD pascal (_far *x) arg #define GUARD() _asm { pushf; cli } #define UNGUARD() _asm { popf } #define FAR _far #elif defined (__WATCOMC__) #define CALLBACK(foo) WORD pascal foo #define PAS_PTR(x,arg) typedef WORD pascal (_far *x) arg #define GUARD() _disable() #define UNGUARD() _enable() #define FAR _far #else #error Unsupported compiler #endif /* * Forwards */ struct _ReqBlock; struct _TxBufDescr; struct _TDBufDescr; /* * Protocol Manager API */ PAS_PTR (ProtMan, (struct _ReqBlock FAR*, WORD)); /* * System request */ PAS_PTR (SystemRequest, (DWORD, DWORD, WORD, WORD, WORD)); /* * MAC API */ PAS_PTR (TransmitChain, (WORD, WORD, struct _TxBufDescr FAR*, WORD)); PAS_PTR (TransferData, (WORD*,WORD, struct _TDBufDescr FAR*, WORD)); PAS_PTR (Request, (WORD, WORD, WORD, DWORD, WORD, WORD)); PAS_PTR (ReceiveRelease,(WORD, WORD)); PAS_PTR (IndicationOn, (WORD)); PAS_PTR (IndicationOff, (WORD)); typedef enum { HARDWARE_NOT_INSTALLED = 0, HARDWARE_FAILED_DIAG = 1, HARDWARE_FAILED_CONFIG = 2, HARDWARE_HARD_FAULT = 3, HARDWARE_SOFT_FAULT = 4, HARDWARE_OK = 7, HARDWARE_MASK = 0x0007, MAC_BOUND = 0x0008, MAC_OPEN = 0x0010, DIAG_IN_PROGRESS = 0x0020 } NdisMacStatus; typedef enum { STATUS_RING_STATUS = 1, STATUS_ADAPTER_CHECK = 2, STATUS_START_RESET = 3, STATUS_INTERRUPT = 4, STATUS_END_RESET = 5 } NdisStatus; typedef enum { FILTER_DIRECTED = 1, FILTER_BROADCAST = 2, FILTER_PROMISCUOUS = 4, FILTER_SOURCE_ROUTE = 8 } NdisPacketFilter; typedef enum { REQ_INITIATE_DIAGNOSTICS = 1, REQ_READ_ERROR_LOG = 2, REQ_SET_STATION_ADDRESS = 3, REQ_OPEN_ADAPTER = 4, REQ_CLOSE_ADAPTER = 5, REQ_RESET_MAC = 6, REQ_SET_PACKET_FILTER = 7, REQ_ADD_MULTICAST_ADDRESS = 8, REQ_DELETE_MULTICAST_ADDRESS = 9, REQ_UPDATE_STATISTICS = 10, REQ_CLEAR_STATISTICS = 11, REQ_INTERRUPT_REQUEST = 12, REQ_SET_FUNCTIONAL_ADDRESS = 13, REQ_SET_LOOKAHEAD = 14 } NdisGeneralRequest; typedef enum { SF_BROADCAST = 0x00000001L, SF_MULTICAST = 0x00000002L, SF_FUNCTIONAL = 0x00000004L, SF_PROMISCUOUS = 0x00000008L, SF_SOFT_ADDRESS = 0x00000010L, SF_STATS_CURRENT = 0x00000020L, SF_INITIATE_DIAGS = 0x00000040L, SF_LOOPBACK = 0x00000080L, SF_RECEIVE_CHAIN = 0x00000100L, SF_SOURCE_ROUTING = 0x00000200L, SF_RESET_MAC = 0x00000400L, SF_OPEN_CLOSE = 0x00000800L, SF_INTERRUPT_REQUEST = 0x00001000L, SF_SOURCE_ROUTING_BRIDGE = 0x00002000L, SF_VIRTUAL_ADDRESSES = 0x00004000L } NdisMacServiceFlags; typedef enum { REQ_INITIATE_BIND = 1, REQ_BIND = 2, REQ_INITIATE_PREBIND = 3, REQ_INITIATE_UNBIND = 4, REQ_UNBIND = 5 } NdisSysRequest; typedef enum { PM_GET_PROTOCOL_MANAGER_INFO = 1, PM_REGISTER_MODULE = 2, PM_BIND_AND_START = 3, PM_GET_PROTOCOL_MANAGER_LINKAGE = 4, PM_GET_PROTOCOL_INI_PATH = 5, PM_REGISTER_PROTOCOL_MANAGER_INFO = 6, PM_INIT_AND_REGISTER = 7, PM_UNBIND_AND_STOP = 8, PM_BIND_STATUS = 9, PM_REGISTER_STATUS = 10 } NdisProtManager; typedef enum { ERR_SUCCESS = 0x00, ERR_WAIT_FOR_RELEASE = 0x01, ERR_REQUEST_QUEUED = 0x02, ERR_FRAME_NOT_RECOGNIZED = 0x03, ERR_FRAME_REJECTED = 0x04, ERR_FORWARD_FRAME = 0x05, ERR_OUT_OF_RESOURCE = 0x06, ERR_INVALID_PARAMETER = 0x07, ERR_INVALID_FUNCTION = 0x08, ERR_NOT_SUPPORTED = 0x09, ERR_HARDWARE_ERROR = 0x0A, ERR_TRANSMIT_ERROR = 0x0B, ERR_NO_SUCH_DESTINATION = 0x0C, ERR_BUFFER_TOO_SMALL = 0x0D, ERR_ALREADY_STARTED = 0x20, ERR_INCOMPLETE_BINDING = 0x21, ERR_DRIVER_NOT_INITIALIZED = 0x22, ERR_HARDWARE_NOT_FOUND = 0x23, ERR_HARDWARE_FAILURE = 0x24, ERR_CONFIGURATION_FAILURE = 0x25, ERR_INTERRUPT_CONFLICT = 0x26, ERR_INCOMPATIBLE_MAC = 0x27, ERR_INITIALIZATION_FAILED = 0x28, ERR_NO_BINDING = 0x29, ERR_NETWORK_MAY_NOT_BE_CONNECTED = 0x2A, ERR_INCOMPATIBLE_OS_VERSION = 0x2B, ERR_ALREADY_REGISTERED = 0x2C, ERR_PATH_NOT_FOUND = 0x2D, ERR_INSUFFICIENT_MEMORY = 0x2E, ERR_INFO_NOT_FOUND = 0x2F, ERR_GENERAL_FAILURE = 0xFF } NdisError; #define NDIS_PARAM_INTEGER 0 #define NDIS_PARAM_STRING 1 #define NDIS_TX_BUF_LENGTH 8 #define NDIS_TD_BUF_LENGTH 1 #define NDIS_RX_BUF_LENGTH 8 #define NDIS_PTR_PHYSICAL 0 #define NDIS_PTR_VIRTUAL 2 #define NDIS_PATH "PROTMAN$" typedef struct _CommonChars { WORD tableSize; BYTE majorNdisVersion; /* 2 - Latest version */ BYTE minorNdisVersion; /* 0 */ WORD reserved1; BYTE majorModuleVersion; BYTE minorModuleVersion; DWORD moduleFlags; /* 0 - Binding at upper boundary supported * 1 - Binding at lower boundary supported * 2 - Dynamically bound. * 3-31 - Reserved, must be zero. */ BYTE moduleName[16]; BYTE protocolLevelUpper; /* 1 - MAC * 2 - Data Link * 3 - Network * 4 - Transport * 5 - Session * -1 - Not specified */ BYTE interfaceUpper; BYTE protocolLevelLower; /* 0 - Physical * 1 - MAC * 2 - Data Link * 3 - Network * 4 - Transport * 5 - Session * -1 - Not specified */ BYTE interfaceLower; WORD moduleId; WORD moduleDS; SystemRequest systemRequest; BYTE *serviceChars; BYTE *serviceStatus; BYTE *upperDispatchTable; BYTE *lowerDispatchTable; BYTE *reserved2; /* Must be NULL */ BYTE *reserved3; /* Must be NULL */ } CommonChars; typedef struct _MulticastList { WORD maxMulticastAddresses; WORD numberMulticastAddresses; BYTE multicastAddress[16][16]; } MulticastList; typedef struct _MacChars { WORD tableSize; BYTE macName[16]; WORD addressLength; BYTE permanentAddress[16]; BYTE currentAddress[16]; DWORD currentFunctionalAddress; MulticastList *multicastList; DWORD linkSpeed; DWORD serviceFlags; WORD maxFrameSize; DWORD txBufferSize; WORD txBufferAllocSize; DWORD rxBufferSize; WORD rxBufferAllocSize; BYTE ieeeVendor[3]; BYTE vendorAdapter; BYTE *vendorAdapterDescription; WORD interruptLevel; WORD txQueueDepth; WORD maxDataBlocks; } MacChars; typedef struct _ProtocolChars { WORD length; BYTE name[16]; WORD type; } ProtocolChars; typedef struct _MacUpperDispatch { CommonChars *backPointer; Request request; TransmitChain transmitChain; TransferData transferData; ReceiveRelease receiveRelease; IndicationOn indicationOn; IndicationOff indicationOff; } MacUpperDispatch; typedef struct _MacStatusTable { WORD tableSize; DWORD lastDiag; DWORD macStatus; WORD packetFilter; BYTE *mediaSpecificStats; DWORD lastClear; DWORD totalFramesRx; DWORD totalFramesCrc; DWORD totalBytesRx; DWORD totalDiscardBufSpaceRx; DWORD totalMulticastRx; DWORD totalBroadcastRx; DWORD obsolete1[5]; DWORD totalDiscardHwErrorRx; DWORD totalFramesTx; DWORD totalBytesTx; DWORD totalMulticastTx; DWORD totalBroadcastTx; DWORD obsolete2[2]; DWORD totalDiscardTimeoutTx; DWORD totalDiscardHwErrorTx; } MacStatusTable; typedef struct _ProtDispatch { CommonChars *backPointer; DWORD flags; /* 0 - handles non-LLC frames * 1 - handles specific-LSAP LLC frames * 2 - handles specific-LSAP LLC frames * 3-31 - reserved must be 0 */ void (*requestConfirm) (void); void (*transmitConfirm) (void); void (*receiveLookahead) (void); void (*indicationComplete) (void); void (*receiveChain) (void); void (*status) (void); } ProtDispatch; typedef struct _ReqBlock { WORD opcode; WORD status; BYTE FAR *pointer1; BYTE FAR *pointer2; WORD word1; } ReqBlock; typedef struct _TxBufDescrRec { BYTE txPtrType; BYTE dummy; WORD txDataLen; BYTE *txDataPtr; } TxBufDescrRec; typedef struct _TxBufDescr { WORD txImmedLen; BYTE *txImmedPtr; WORD txDataCount; TxBufDescrRec txBufDescrRec[NDIS_TX_BUF_LENGTH]; } TxBufDescr; typedef struct _TDBufDescrRec { BYTE tDPtrType; BYTE dummy; WORD tDDataLen; BYTE *tDDataPtr; } TDBufDescrRec; typedef struct _TDBufDescr { WORD tDDataCount; TDBufDescrRec tDBufDescrRec[NDIS_TD_BUF_LENGTH]; } TDBufDescr; typedef struct _RxBufDescrRec { WORD rxDataLen; BYTE *rxDataPtr; } RxBufDescrRec; typedef struct _RxBufDescr { WORD rxDataCount; RxBufDescrRec rxBufDescrRec[NDIS_RX_BUF_LENGTH]; } RxBufDescr; typedef struct _PktBuf { struct _PktBuf *nextLink; struct _PktBuf *prevLink; int handle; int length; int packetLength; DWORD sequence; BYTE *buffer; } PktBuf; typedef struct _CardHandle { BYTE moduleName[16]; CommonChars *common; } CardHandle; typedef struct _BindingsList { WORD numBindings; BYTE moduleName[2][16]; } BindingsList; typedef struct _FailingModules { BYTE upperModuleName[16]; BYTE lowerModuleName[16]; } FailingModules; typedef union _HardwareAddress { BYTE bytes[6]; WORD words[3]; struct { BYTE bytes[6]; } addr; } HardwareAddress; typedef struct _FddiHeader { BYTE frameControl; HardwareAddress etherDestHost; HardwareAddress etherSrcHost; } FddiHeader; typedef struct _EthernetIIHeader { HardwareAddress etherDestHost; HardwareAddress etherSrcHost; WORD etherType; } EthernetIIHeader; typedef struct _Ieee802Dot5Header { HardwareAddress etherDestHost; HardwareAddress etherSrcHost; BYTE routeInfo[30]; } Ieee802Dot5Header; typedef struct _Ieee802Dot2SnapHeader { BYTE dsap; /* 0xAA */ BYTE ssap; /* 0xAA */ BYTE control; /* 3 */ BYTE protocolId[5]; } Ieee802Dot2SnapHeader; /* * Prototypes */ extern char *NdisLastError (void); extern int NdisOpen (void); extern int NdisInit (int promis); extern int NdisRegisterAndBind (int promis); extern void NdisShutdown (void); extern void NdisCheckMacFeatures (struct _CardHandle *card); extern int NdisSendPacket (struct _PktBuf *pktBuf, int macId); /* * Assembly "glue" functions */ extern int systemRequestGlue(); extern int requestConfirmGlue(); extern int transmitConfirmGlue(); extern int receiveLookaheadGlue(); extern int indicationCompleteGlue(); extern int receiveChainGlue(); extern int statusGlue(); /* * IOCTL function */ #ifdef __SMALL__ extern int _far NdisGetLinkage (int handle, char *data, int size); #else extern int NdisGetLinkage (int handle, char *data, int size); #endif /* * NDIS callback handlers */ CALLBACK (NdisSystemRequest (DWORD,DWORD, WORD, WORD, WORD)); CALLBACK (NdisRequestConfirm ( WORD, WORD, WORD, WORD, WORD,WORD)); CALLBACK (NdisTransmitConfirm ( WORD, WORD, WORD, WORD, WORD)); CALLBACK (NdisReceiveLookahead ( WORD, WORD, WORD, BYTE*, BYTE*, WORD)); CALLBACK (NdisReceiveChain ( WORD, WORD, WORD, struct _RxBufDescr*, BYTE*, WORD)); CALLBACK (NdisStatusProc ( WORD, WORD, BYTE*, WORD,WORD)); CALLBACK (NdisIndicationComplete( WORD, WORD)); BYTE *NdisAllocStack (void); void NdisFreeStack (BYTE*); #ifdef __HIGHC__ #define RENAME_ASM_SYM(x) pragma Alias(x,"@" #x "") /* prepend `@' */ #define RENAME_C_SYM(x) pragma Alias(x,"_" #x "") /* prepend `_' */ RENAME_ASM_SYM (systemRequestGlue); RENAME_ASM_SYM (requestConfirmGlue); RENAME_ASM_SYM (transmitConfirmGlue); RENAME_ASM_SYM (receiveLookaheadGlue); RENAME_ASM_SYM (indicationCompleteGlue); RENAME_ASM_SYM (receiveChainGlue); RENAME_ASM_SYM (statusGlue); RENAME_ASM_SYM (NdisGetLinkage); RENAME_C_SYM (NdisSystemRequest); RENAME_C_SYM (NdisRequestConfirm); RENAME_C_SYM (NdisTransmitConfirm); RENAME_C_SYM (NdisReceiveLookahead); RENAME_C_SYM (NdisIndicationComplete); RENAME_C_SYM (NdisReceiveChain); RENAME_C_SYM (NdisStatusProc); RENAME_C_SYM (NdisAllocStack); RENAME_C_SYM (NdisFreeStack); #endif #endif