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