Home | History | Annotate | Download | only in msdos
      1 /*
      2  * Copyright (c) 1993,1994
      3  *      Texas A&M University.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *      This product includes software developed by Texas A&M University
     16  *      and its contributors.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  *
     33  * Developers:
     34  *             David K. Hess, Douglas Lee Schales, David R. Safford
     35  *
     36  * Heavily modified for Metaware HighC + GNU C 2.8+
     37  *             Gisle Vanem 1998
     38  */
     39 
     40 #ifndef __PCAP_NDIS_H
     41 #define __PCAP_NDIS_H
     42 
     43 #if defined (__HIGHC__)
     44   #define pascal          _CC(_CALLEE_POPS_STACK & ~_REVERSE_PARMS) /* calling convention */
     45   #define CALLBACK(foo)   pascal WORD foo
     46   #define PAS_PTR(x,arg)  typedef FAR WORD pascal (*x) arg
     47   #define GUARD()         _inline (0x9C,0xFA)   /* pushfd, cli */
     48   #define UNGUARD()       _inline (0x9D)        /* popfd */
     49   #define FAR             _far
     50 
     51 #elif defined(__GNUC__)
     52   #define CALLBACK(foo)   WORD foo __attribute__((stdcall))
     53   #define PAS_PTR(x,arg)  typedef WORD (*x) arg __attribute__((stdcall))
     54   #define GUARD()         __asm__ __volatile__ ("pushfd; cli")
     55   #define UNGUARD()       __asm__ __volatile__ ("popfd")
     56   #define FAR
     57 
     58 #elif defined (__TURBOC__)
     59   #define CALLBACK(foo)   WORD pascal foo
     60   #define PAS_PTR(x,arg)  typedef WORD pascal (_far *x) arg
     61   #define GUARD()         _asm { pushf; cli }
     62   #define UNGUARD()       _asm { popf }
     63   #define FAR             _far
     64 
     65 #elif defined (__WATCOMC__)
     66   #define CALLBACK(foo)   WORD pascal foo
     67   #define PAS_PTR(x,arg)  typedef WORD pascal (_far *x) arg
     68   #define GUARD()         _disable()
     69   #define UNGUARD()       _enable()
     70   #define FAR             _far
     71 
     72 #else
     73   #error Unsupported compiler
     74 #endif
     75 
     76 
     77 /*
     78  *  Forwards
     79  */
     80 struct _ReqBlock;
     81 struct _TxBufDescr;
     82 struct _TDBufDescr;
     83 
     84 /*
     85  * Protocol Manager API
     86  */
     87 PAS_PTR (ProtMan, (struct _ReqBlock FAR*, WORD));
     88 
     89 /*
     90  * System request
     91  */
     92 PAS_PTR (SystemRequest, (DWORD, DWORD, WORD, WORD, WORD));
     93 
     94 /*
     95  * MAC API
     96  */
     97 PAS_PTR (TransmitChain, (WORD, WORD, struct _TxBufDescr FAR*, WORD));
     98 PAS_PTR (TransferData,  (WORD*,WORD, struct _TDBufDescr FAR*, WORD));
     99 PAS_PTR (Request,       (WORD, WORD, WORD, DWORD, WORD, WORD));
    100 PAS_PTR (ReceiveRelease,(WORD, WORD));
    101 PAS_PTR (IndicationOn,  (WORD));
    102 PAS_PTR (IndicationOff, (WORD));
    103 
    104 
    105 typedef enum {
    106         HARDWARE_NOT_INSTALLED  = 0,
    107         HARDWARE_FAILED_DIAG    = 1,
    108         HARDWARE_FAILED_CONFIG  = 2,
    109         HARDWARE_HARD_FAULT     = 3,
    110         HARDWARE_SOFT_FAULT     = 4,
    111         HARDWARE_OK             = 7,
    112         HARDWARE_MASK           = 0x0007,
    113         MAC_BOUND               = 0x0008,
    114         MAC_OPEN                = 0x0010,
    115         DIAG_IN_PROGRESS        = 0x0020
    116       } NdisMacStatus;
    117 
    118 typedef enum {
    119         STATUS_RING_STATUS      = 1,
    120         STATUS_ADAPTER_CHECK    = 2,
    121         STATUS_START_RESET      = 3,
    122         STATUS_INTERRUPT        = 4,
    123         STATUS_END_RESET        = 5
    124       } NdisStatus;
    125 
    126 typedef enum {
    127         FILTER_DIRECTED         = 1,
    128         FILTER_BROADCAST        = 2,
    129         FILTER_PROMISCUOUS      = 4,
    130         FILTER_SOURCE_ROUTE     = 8
    131       } NdisPacketFilter;
    132 
    133 typedef enum {
    134         REQ_INITIATE_DIAGNOSTICS     = 1,
    135         REQ_READ_ERROR_LOG           = 2,
    136         REQ_SET_STATION_ADDRESS      = 3,
    137         REQ_OPEN_ADAPTER             = 4,
    138         REQ_CLOSE_ADAPTER            = 5,
    139         REQ_RESET_MAC                = 6,
    140         REQ_SET_PACKET_FILTER        = 7,
    141         REQ_ADD_MULTICAST_ADDRESS    = 8,
    142         REQ_DELETE_MULTICAST_ADDRESS = 9,
    143         REQ_UPDATE_STATISTICS        = 10,
    144         REQ_CLEAR_STATISTICS         = 11,
    145         REQ_INTERRUPT_REQUEST        = 12,
    146         REQ_SET_FUNCTIONAL_ADDRESS   = 13,
    147         REQ_SET_LOOKAHEAD            = 14
    148       } NdisGeneralRequest;
    149 
    150 typedef enum {
    151         SF_BROADCAST             = 0x00000001L,
    152         SF_MULTICAST             = 0x00000002L,
    153         SF_FUNCTIONAL            = 0x00000004L,
    154         SF_PROMISCUOUS           = 0x00000008L,
    155         SF_SOFT_ADDRESS          = 0x00000010L,
    156         SF_STATS_CURRENT         = 0x00000020L,
    157         SF_INITIATE_DIAGS        = 0x00000040L,
    158         SF_LOOPBACK              = 0x00000080L,
    159         SF_RECEIVE_CHAIN         = 0x00000100L,
    160         SF_SOURCE_ROUTING        = 0x00000200L,
    161         SF_RESET_MAC             = 0x00000400L,
    162         SF_OPEN_CLOSE            = 0x00000800L,
    163         SF_INTERRUPT_REQUEST     = 0x00001000L,
    164         SF_SOURCE_ROUTING_BRIDGE = 0x00002000L,
    165         SF_VIRTUAL_ADDRESSES     = 0x00004000L
    166       } NdisMacServiceFlags;
    167 
    168 typedef enum {
    169         REQ_INITIATE_BIND        = 1,
    170         REQ_BIND                 = 2,
    171         REQ_INITIATE_PREBIND     = 3,
    172         REQ_INITIATE_UNBIND      = 4,
    173         REQ_UNBIND               = 5
    174       } NdisSysRequest;
    175 
    176 typedef enum  {
    177         PM_GET_PROTOCOL_MANAGER_INFO      = 1,
    178         PM_REGISTER_MODULE                = 2,
    179         PM_BIND_AND_START                 = 3,
    180         PM_GET_PROTOCOL_MANAGER_LINKAGE   = 4,
    181         PM_GET_PROTOCOL_INI_PATH          = 5,
    182         PM_REGISTER_PROTOCOL_MANAGER_INFO = 6,
    183         PM_INIT_AND_REGISTER              = 7,
    184         PM_UNBIND_AND_STOP                = 8,
    185         PM_BIND_STATUS                    = 9,
    186         PM_REGISTER_STATUS                = 10
    187       } NdisProtManager;
    188 
    189 
    190 typedef enum {
    191         ERR_SUCCESS                      = 0x00,
    192         ERR_WAIT_FOR_RELEASE             = 0x01,
    193         ERR_REQUEST_QUEUED               = 0x02,
    194         ERR_FRAME_NOT_RECOGNIZED         = 0x03,
    195         ERR_FRAME_REJECTED               = 0x04,
    196         ERR_FORWARD_FRAME                = 0x05,
    197         ERR_OUT_OF_RESOURCE              = 0x06,
    198         ERR_INVALID_PARAMETER            = 0x07,
    199         ERR_INVALID_FUNCTION             = 0x08,
    200         ERR_NOT_SUPPORTED                = 0x09,
    201         ERR_HARDWARE_ERROR               = 0x0A,
    202         ERR_TRANSMIT_ERROR               = 0x0B,
    203         ERR_NO_SUCH_DESTINATION          = 0x0C,
    204         ERR_BUFFER_TOO_SMALL             = 0x0D,
    205         ERR_ALREADY_STARTED              = 0x20,
    206         ERR_INCOMPLETE_BINDING           = 0x21,
    207         ERR_DRIVER_NOT_INITIALIZED       = 0x22,
    208         ERR_HARDWARE_NOT_FOUND           = 0x23,
    209         ERR_HARDWARE_FAILURE             = 0x24,
    210         ERR_CONFIGURATION_FAILURE        = 0x25,
    211         ERR_INTERRUPT_CONFLICT           = 0x26,
    212         ERR_INCOMPATIBLE_MAC             = 0x27,
    213         ERR_INITIALIZATION_FAILED        = 0x28,
    214         ERR_NO_BINDING                   = 0x29,
    215         ERR_NETWORK_MAY_NOT_BE_CONNECTED = 0x2A,
    216         ERR_INCOMPATIBLE_OS_VERSION      = 0x2B,
    217         ERR_ALREADY_REGISTERED           = 0x2C,
    218         ERR_PATH_NOT_FOUND               = 0x2D,
    219         ERR_INSUFFICIENT_MEMORY          = 0x2E,
    220         ERR_INFO_NOT_FOUND               = 0x2F,
    221         ERR_GENERAL_FAILURE              = 0xFF
    222       } NdisError;
    223 
    224 #define NDIS_PARAM_INTEGER   0
    225 #define NDIS_PARAM_STRING    1
    226 
    227 #define NDIS_TX_BUF_LENGTH   8
    228 #define NDIS_TD_BUF_LENGTH   1
    229 #define NDIS_RX_BUF_LENGTH   8
    230 
    231 #define NDIS_PTR_PHYSICAL    0
    232 #define NDIS_PTR_VIRTUAL     2
    233 
    234 #define NDIS_PATH    "PROTMAN$"
    235 
    236 
    237 typedef struct _CommonChars {
    238         WORD  tableSize;
    239         BYTE  majorNdisVersion;        /* 2 - Latest version */
    240         BYTE  minorNdisVersion;        /* 0                  */
    241         WORD  reserved1;
    242         BYTE  majorModuleVersion;
    243         BYTE  minorModuleVersion;
    244         DWORD moduleFlags;
    245         /* 0 - Binding at upper boundary supported
    246          * 1 - Binding at lower boundary supported
    247          * 2 - Dynamically bound.
    248          * 3-31 - Reserved, must be zero.
    249          */
    250         BYTE  moduleName[16];
    251         BYTE  protocolLevelUpper;
    252         /* 1 - MAC
    253          * 2 - Data Link
    254          * 3 - Network
    255          * 4 - Transport
    256          * 5 - Session
    257          * -1 - Not specified
    258          */
    259         BYTE  interfaceUpper;
    260         BYTE  protocolLevelLower;
    261         /* 0 - Physical
    262          * 1 - MAC
    263          * 2 - Data Link
    264          * 3 - Network
    265          * 4 - Transport
    266          * 5 - Session
    267          * -1 - Not specified
    268          */
    269         BYTE  interfaceLower;
    270         WORD  moduleId;
    271         WORD  moduleDS;
    272         SystemRequest systemRequest;
    273         BYTE *serviceChars;
    274         BYTE *serviceStatus;
    275         BYTE *upperDispatchTable;
    276         BYTE *lowerDispatchTable;
    277         BYTE *reserved2;            /* Must be NULL */
    278         BYTE *reserved3;            /* Must be NULL */
    279       } CommonChars;
    280 
    281 
    282 typedef struct _MulticastList {
    283         WORD   maxMulticastAddresses;
    284         WORD   numberMulticastAddresses;
    285         BYTE   multicastAddress[16][16];
    286       } MulticastList;
    287 
    288 
    289 typedef struct _MacChars {
    290         WORD   tableSize;
    291         BYTE   macName[16];
    292         WORD   addressLength;
    293         BYTE   permanentAddress[16];
    294         BYTE   currentAddress[16];
    295         DWORD  currentFunctionalAddress;
    296         MulticastList *multicastList;
    297         DWORD  linkSpeed;
    298         DWORD  serviceFlags;
    299         WORD   maxFrameSize;
    300         DWORD  txBufferSize;
    301         WORD   txBufferAllocSize;
    302         DWORD  rxBufferSize;
    303         WORD   rxBufferAllocSize;
    304         BYTE   ieeeVendor[3];
    305         BYTE   vendorAdapter;
    306         BYTE  *vendorAdapterDescription;
    307         WORD   interruptLevel;
    308         WORD   txQueueDepth;
    309         WORD   maxDataBlocks;
    310       } MacChars;
    311 
    312 
    313 typedef struct _ProtocolChars {
    314         WORD   length;
    315         BYTE   name[16];
    316         WORD   type;
    317       } ProtocolChars;
    318 
    319 
    320 typedef struct _MacUpperDispatch {
    321         CommonChars      *backPointer;
    322         Request           request;
    323         TransmitChain     transmitChain;
    324         TransferData      transferData;
    325         ReceiveRelease    receiveRelease;
    326         IndicationOn      indicationOn;
    327         IndicationOff     indicationOff;
    328       } MacUpperDispatch;
    329 
    330 
    331 typedef struct _MacStatusTable {
    332         WORD   tableSize;
    333         DWORD  lastDiag;
    334         DWORD  macStatus;
    335         WORD   packetFilter;
    336         BYTE  *mediaSpecificStats;
    337         DWORD  lastClear;
    338         DWORD  totalFramesRx;
    339         DWORD  totalFramesCrc;
    340         DWORD  totalBytesRx;
    341         DWORD  totalDiscardBufSpaceRx;
    342         DWORD  totalMulticastRx;
    343         DWORD  totalBroadcastRx;
    344         DWORD  obsolete1[5];
    345         DWORD  totalDiscardHwErrorRx;
    346         DWORD  totalFramesTx;
    347         DWORD  totalBytesTx;
    348         DWORD  totalMulticastTx;
    349         DWORD  totalBroadcastTx;
    350         DWORD  obsolete2[2];
    351         DWORD  totalDiscardTimeoutTx;
    352         DWORD  totalDiscardHwErrorTx;
    353       } MacStatusTable;
    354 
    355 
    356 typedef struct _ProtDispatch {
    357         CommonChars *backPointer;
    358         DWORD        flags;
    359         /* 0 - handles non-LLC frames
    360          * 1 - handles specific-LSAP LLC frames
    361          * 2 - handles specific-LSAP LLC frames
    362          * 3-31 - reserved must be 0
    363          */
    364         void  (*requestConfirm) (void);
    365         void  (*transmitConfirm) (void);
    366         void  (*receiveLookahead) (void);
    367         void  (*indicationComplete) (void);
    368         void  (*receiveChain) (void);
    369         void  (*status) (void);
    370       } ProtDispatch;
    371 
    372 
    373 typedef struct _ReqBlock {
    374         WORD      opcode;
    375         WORD      status;
    376         BYTE FAR *pointer1;
    377         BYTE FAR *pointer2;
    378         WORD      word1;
    379       } ReqBlock;
    380 
    381 
    382 typedef struct _TxBufDescrRec {
    383         BYTE   txPtrType;
    384         BYTE   dummy;
    385         WORD   txDataLen;
    386         BYTE  *txDataPtr;
    387       } TxBufDescrRec;
    388 
    389 
    390 typedef struct _TxBufDescr {
    391         WORD          txImmedLen;
    392         BYTE         *txImmedPtr;
    393         WORD          txDataCount;
    394         TxBufDescrRec txBufDescrRec[NDIS_TX_BUF_LENGTH];
    395       } TxBufDescr;
    396 
    397 
    398 typedef struct _TDBufDescrRec {
    399         BYTE   tDPtrType;
    400         BYTE   dummy;
    401         WORD   tDDataLen;
    402         BYTE  *tDDataPtr;
    403       } TDBufDescrRec;
    404 
    405 
    406 typedef struct _TDBufDescr {
    407         WORD          tDDataCount;
    408         TDBufDescrRec tDBufDescrRec[NDIS_TD_BUF_LENGTH];
    409       } TDBufDescr;
    410 
    411 
    412 typedef struct _RxBufDescrRec {
    413         WORD   rxDataLen;
    414         BYTE  *rxDataPtr;
    415       } RxBufDescrRec;
    416 
    417 
    418 typedef struct _RxBufDescr {
    419         WORD          rxDataCount;
    420         RxBufDescrRec rxBufDescrRec[NDIS_RX_BUF_LENGTH];
    421       } RxBufDescr;
    422 
    423 
    424 typedef struct _PktBuf {
    425 	struct _PktBuf *nextLink;
    426 	struct _PktBuf *prevLink;
    427         int    handle;
    428         int    length;
    429         int    packetLength;
    430         DWORD  sequence;
    431         BYTE  *buffer;
    432       } PktBuf;
    433 
    434 
    435 typedef struct _CardHandle {
    436         BYTE         moduleName[16];
    437         CommonChars *common;
    438       } CardHandle;
    439 
    440 
    441 typedef struct _BindingsList {
    442         WORD  numBindings;
    443         BYTE  moduleName[2][16];
    444       } BindingsList;
    445 
    446 
    447 typedef struct _FailingModules {
    448         BYTE  upperModuleName[16];
    449         BYTE  lowerModuleName[16];
    450       } FailingModules;
    451 
    452 
    453 typedef union _HardwareAddress {
    454         BYTE  bytes[6];
    455         WORD  words[3];
    456         struct {
    457           BYTE bytes[6];
    458         } addr;
    459       } HardwareAddress;
    460 
    461 
    462 typedef struct _FddiHeader {
    463         BYTE             frameControl;
    464         HardwareAddress  etherDestHost;
    465         HardwareAddress  etherSrcHost;
    466       } FddiHeader;
    467 
    468 
    469 typedef struct _EthernetIIHeader {
    470         HardwareAddress  etherDestHost;
    471         HardwareAddress  etherSrcHost;
    472         WORD             etherType;
    473       } EthernetIIHeader;
    474 
    475 
    476 typedef struct _Ieee802Dot5Header {
    477         HardwareAddress  etherDestHost;
    478         HardwareAddress  etherSrcHost;
    479         BYTE             routeInfo[30];
    480       } Ieee802Dot5Header;
    481 
    482 
    483 typedef struct _Ieee802Dot2SnapHeader {
    484         BYTE  dsap;                      /* 0xAA */
    485         BYTE  ssap;                      /* 0xAA */
    486         BYTE  control;                   /* 3    */
    487         BYTE protocolId[5];
    488       } Ieee802Dot2SnapHeader;
    489 
    490 
    491 /*
    492  *  Prototypes
    493  */
    494 extern char *NdisLastError        (void);
    495 extern int   NdisOpen             (void);
    496 extern int   NdisInit             (int promis);
    497 extern int   NdisRegisterAndBind  (int promis);
    498 extern void  NdisShutdown         (void);
    499 extern void  NdisCheckMacFeatures (struct _CardHandle *card);
    500 extern int   NdisSendPacket       (struct _PktBuf *pktBuf, int macId);
    501 
    502 /*
    503  *  Assembly "glue" functions
    504  */
    505 extern int systemRequestGlue();
    506 extern int requestConfirmGlue();
    507 extern int transmitConfirmGlue();
    508 extern int receiveLookaheadGlue();
    509 extern int indicationCompleteGlue();
    510 extern int receiveChainGlue();
    511 extern int statusGlue();
    512 
    513 /*
    514  *  IOCTL function
    515  */
    516 #ifdef __SMALL__
    517 extern int _far NdisGetLinkage (int handle, char *data, int size);
    518 #else
    519 extern int NdisGetLinkage (int handle, char *data, int size);
    520 #endif
    521 
    522 /*
    523  *  NDIS callback handlers
    524  */
    525 CALLBACK (NdisSystemRequest     (DWORD,DWORD, WORD, WORD, WORD));
    526 CALLBACK (NdisRequestConfirm    ( WORD, WORD, WORD, WORD, WORD,WORD));
    527 CALLBACK (NdisTransmitConfirm   ( WORD, WORD, WORD, WORD, WORD));
    528 CALLBACK (NdisReceiveLookahead  ( WORD, WORD, WORD, BYTE*, BYTE*, WORD));
    529 CALLBACK (NdisReceiveChain      ( WORD, WORD, WORD, struct _RxBufDescr*, BYTE*, WORD));
    530 CALLBACK (NdisStatusProc        ( WORD, WORD, BYTE*, WORD,WORD));
    531 CALLBACK (NdisIndicationComplete( WORD, WORD));
    532 
    533 BYTE *NdisAllocStack (void);
    534 void  NdisFreeStack  (BYTE*);
    535 
    536 #ifdef __HIGHC__
    537   #define RENAME_ASM_SYM(x) pragma Alias(x,"@" #x "")  /* prepend `@' */
    538   #define RENAME_C_SYM(x)   pragma Alias(x,"_" #x "")  /* prepend `_' */
    539 
    540   RENAME_ASM_SYM (systemRequestGlue);
    541   RENAME_ASM_SYM (requestConfirmGlue);
    542   RENAME_ASM_SYM (transmitConfirmGlue);
    543   RENAME_ASM_SYM (receiveLookaheadGlue);
    544   RENAME_ASM_SYM (indicationCompleteGlue);
    545   RENAME_ASM_SYM (receiveChainGlue);
    546   RENAME_ASM_SYM (statusGlue);
    547   RENAME_ASM_SYM (NdisGetLinkage);
    548   RENAME_C_SYM   (NdisSystemRequest);
    549   RENAME_C_SYM   (NdisRequestConfirm);
    550   RENAME_C_SYM   (NdisTransmitConfirm);
    551   RENAME_C_SYM   (NdisReceiveLookahead);
    552   RENAME_C_SYM   (NdisIndicationComplete);
    553   RENAME_C_SYM   (NdisReceiveChain);
    554   RENAME_C_SYM   (NdisStatusProc);
    555   RENAME_C_SYM   (NdisAllocStack);
    556   RENAME_C_SYM   (NdisFreeStack);
    557 #endif
    558 
    559 #endif
    560