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 */
80struct _ReqBlock;
81struct _TxBufDescr;
82struct _TDBufDescr;
83
84/*
85 * Protocol Manager API
86 */
87PAS_PTR (ProtMan, (struct _ReqBlock FAR*, WORD));
88
89/*
90 * System request
91 */
92PAS_PTR (SystemRequest, (DWORD, DWORD, WORD, WORD, WORD));
93
94/*
95 * MAC API
96 */
97PAS_PTR (TransmitChain, (WORD, WORD, struct _TxBufDescr FAR*, WORD));
98PAS_PTR (TransferData,  (WORD*,WORD, struct _TDBufDescr FAR*, WORD));
99PAS_PTR (Request,       (WORD, WORD, WORD, DWORD, WORD, WORD));
100PAS_PTR (ReceiveRelease,(WORD, WORD));
101PAS_PTR (IndicationOn,  (WORD));
102PAS_PTR (IndicationOff, (WORD));
103
104
105typedef 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
118typedef 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
126typedef enum {
127        FILTER_DIRECTED         = 1,
128        FILTER_BROADCAST        = 2,
129        FILTER_PROMISCUOUS      = 4,
130        FILTER_SOURCE_ROUTE     = 8
131      } NdisPacketFilter;
132
133typedef 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
150typedef 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
168typedef 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
176typedef 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
190typedef 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
237typedef 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
282typedef struct _MulticastList {
283        WORD   maxMulticastAddresses;
284        WORD   numberMulticastAddresses;
285        BYTE   multicastAddress[16][16];
286      } MulticastList;
287
288
289typedef 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
313typedef struct _ProtocolChars {
314        WORD   length;
315        BYTE   name[16];
316        WORD   type;
317      } ProtocolChars;
318
319
320typedef 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
331typedef 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
356typedef 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
373typedef struct _ReqBlock {
374        WORD      opcode;
375        WORD      status;
376        BYTE FAR *pointer1;
377        BYTE FAR *pointer2;
378        WORD      word1;
379      } ReqBlock;
380
381
382typedef struct _TxBufDescrRec {
383        BYTE   txPtrType;
384        BYTE   dummy;
385        WORD   txDataLen;
386        BYTE  *txDataPtr;
387      } TxBufDescrRec;
388
389
390typedef struct _TxBufDescr {
391        WORD          txImmedLen;
392        BYTE         *txImmedPtr;
393        WORD          txDataCount;
394        TxBufDescrRec txBufDescrRec[NDIS_TX_BUF_LENGTH];
395      } TxBufDescr;
396
397
398typedef struct _TDBufDescrRec {
399        BYTE   tDPtrType;
400        BYTE   dummy;
401        WORD   tDDataLen;
402        BYTE  *tDDataPtr;
403      } TDBufDescrRec;
404
405
406typedef struct _TDBufDescr {
407        WORD          tDDataCount;
408        TDBufDescrRec tDBufDescrRec[NDIS_TD_BUF_LENGTH];
409      } TDBufDescr;
410
411
412typedef struct _RxBufDescrRec {
413        WORD   rxDataLen;
414        BYTE  *rxDataPtr;
415      } RxBufDescrRec;
416
417
418typedef struct _RxBufDescr {
419        WORD          rxDataCount;
420        RxBufDescrRec rxBufDescrRec[NDIS_RX_BUF_LENGTH];
421      } RxBufDescr;
422
423
424typedef 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
435typedef struct _CardHandle {
436        BYTE         moduleName[16];
437        CommonChars *common;
438      } CardHandle;
439
440
441typedef struct _BindingsList {
442        WORD  numBindings;
443        BYTE  moduleName[2][16];
444      } BindingsList;
445
446
447typedef struct _FailingModules {
448        BYTE  upperModuleName[16];
449        BYTE  lowerModuleName[16];
450      } FailingModules;
451
452
453typedef union _HardwareAddress {
454        BYTE  bytes[6];
455        WORD  words[3];
456        struct {
457          BYTE bytes[6];
458        } addr;
459      } HardwareAddress;
460
461
462typedef struct _FddiHeader {
463        BYTE             frameControl;
464        HardwareAddress  etherDestHost;
465        HardwareAddress  etherSrcHost;
466      } FddiHeader;
467
468
469typedef struct _EthernetIIHeader {
470        HardwareAddress  etherDestHost;
471        HardwareAddress  etherSrcHost;
472        WORD             etherType;
473      } EthernetIIHeader;
474
475
476typedef struct _Ieee802Dot5Header {
477        HardwareAddress  etherDestHost;
478        HardwareAddress  etherSrcHost;
479        BYTE             routeInfo[30];
480      } Ieee802Dot5Header;
481
482
483typedef 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 */
494extern char *NdisLastError        (void);
495extern int   NdisOpen             (void);
496extern int   NdisInit             (int promis);
497extern int   NdisRegisterAndBind  (int promis);
498extern void  NdisShutdown         (void);
499extern void  NdisCheckMacFeatures (struct _CardHandle *card);
500extern int   NdisSendPacket       (struct _PktBuf *pktBuf, int macId);
501
502/*
503 *  Assembly "glue" functions
504 */
505extern int systemRequestGlue();
506extern int requestConfirmGlue();
507extern int transmitConfirmGlue();
508extern int receiveLookaheadGlue();
509extern int indicationCompleteGlue();
510extern int receiveChainGlue();
511extern int statusGlue();
512
513/*
514 *  IOCTL function
515 */
516#ifdef __SMALL__
517extern int _far NdisGetLinkage (int handle, char *data, int size);
518#else
519extern int NdisGetLinkage (int handle, char *data, int size);
520#endif
521
522/*
523 *  NDIS callback handlers
524 */
525CALLBACK (NdisSystemRequest     (DWORD,DWORD, WORD, WORD, WORD));
526CALLBACK (NdisRequestConfirm    ( WORD, WORD, WORD, WORD, WORD,WORD));
527CALLBACK (NdisTransmitConfirm   ( WORD, WORD, WORD, WORD, WORD));
528CALLBACK (NdisReceiveLookahead  ( WORD, WORD, WORD, BYTE*, BYTE*, WORD));
529CALLBACK (NdisReceiveChain      ( WORD, WORD, WORD, struct _RxBufDescr*, BYTE*, WORD));
530CALLBACK (NdisStatusProc        ( WORD, WORD, BYTE*, WORD,WORD));
531CALLBACK (NdisIndicationComplete( WORD, WORD));
532
533BYTE *NdisAllocStack (void);
534void  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