2 * Copyright (c) 1993,1994
\r
3 * Texas A&M University. All rights reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions
\r
8 * 1. Redistributions of source code must retain the above copyright
\r
9 * notice, this list of conditions and the following disclaimer.
\r
10 * 2. Redistributions in binary form must reproduce the above copyright
\r
11 * notice, this list of conditions and the following disclaimer in the
\r
12 * documentation and/or other materials provided with the distribution.
\r
13 * 3. All advertising materials mentioning features or use of this software
\r
14 * must display the following acknowledgement:
\r
15 * This product includes software developed by Texas A&M University
\r
16 * and its contributors.
\r
17 * 4. Neither the name of the University nor the names of its contributors
\r
18 * may be used to endorse or promote products derived from this software
\r
19 * without specific prior written permission.
\r
21 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
\r
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\r
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
\r
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
\r
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
\r
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
\r
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
\r
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
\r
34 * David K. Hess, Douglas Lee Schales, David R. Safford
\r
36 * Heavily modified for Metaware HighC + GNU C 2.8+
\r
40 #ifndef __PCAP_NDIS_H
\r
41 #define __PCAP_NDIS_H
\r
43 #if defined (__HIGHC__)
\r
44 #define pascal _CC(_CALLEE_POPS_STACK & ~_REVERSE_PARMS) /* calling convention */
\r
45 #define CALLBACK(foo) pascal WORD foo
\r
46 #define PAS_PTR(x,arg) typedef FAR WORD pascal (*x) arg
\r
47 #define GUARD() _inline (0x9C,0xFA) /* pushfd, cli */
\r
48 #define UNGUARD() _inline (0x9D) /* popfd */
\r
51 #elif defined(__GNUC__)
\r
52 #define CALLBACK(foo) WORD foo __attribute__((stdcall))
\r
53 #define PAS_PTR(x,arg) typedef WORD (*x) arg __attribute__((stdcall))
\r
54 #define GUARD() __asm__ __volatile__ ("pushfd; cli")
\r
55 #define UNGUARD() __asm__ __volatile__ ("popfd")
\r
58 #elif defined (__TURBOC__)
\r
59 #define CALLBACK(foo) WORD pascal foo
\r
60 #define PAS_PTR(x,arg) typedef WORD pascal (_far *x) arg
\r
61 #define GUARD() _asm { pushf; cli }
\r
62 #define UNGUARD() _asm { popf }
\r
65 #elif defined (__WATCOMC__)
\r
66 #define CALLBACK(foo) WORD pascal foo
\r
67 #define PAS_PTR(x,arg) typedef WORD pascal (_far *x) arg
\r
68 #define GUARD() _disable()
\r
69 #define UNGUARD() _enable()
\r
73 #error Unsupported compiler
\r
85 * Protocol Manager API
\r
87 PAS_PTR (ProtMan, (struct _ReqBlock FAR*, WORD));
\r
92 PAS_PTR (SystemRequest, (DWORD, DWORD, WORD, WORD, WORD));
\r
97 PAS_PTR (TransmitChain, (WORD, WORD, struct _TxBufDescr FAR*, WORD));
\r
98 PAS_PTR (TransferData, (WORD*,WORD, struct _TDBufDescr FAR*, WORD));
\r
99 PAS_PTR (Request, (WORD, WORD, WORD, DWORD, WORD, WORD));
\r
100 PAS_PTR (ReceiveRelease,(WORD, WORD));
\r
101 PAS_PTR (IndicationOn, (WORD));
\r
102 PAS_PTR (IndicationOff, (WORD));
\r
106 HARDWARE_NOT_INSTALLED = 0,
\r
107 HARDWARE_FAILED_DIAG = 1,
\r
108 HARDWARE_FAILED_CONFIG = 2,
\r
109 HARDWARE_HARD_FAULT = 3,
\r
110 HARDWARE_SOFT_FAULT = 4,
\r
112 HARDWARE_MASK = 0x0007,
\r
113 MAC_BOUND = 0x0008,
\r
115 DIAG_IN_PROGRESS = 0x0020
\r
119 STATUS_RING_STATUS = 1,
\r
120 STATUS_ADAPTER_CHECK = 2,
\r
121 STATUS_START_RESET = 3,
\r
122 STATUS_INTERRUPT = 4,
\r
123 STATUS_END_RESET = 5
\r
127 FILTER_DIRECTED = 1,
\r
128 FILTER_BROADCAST = 2,
\r
129 FILTER_PROMISCUOUS = 4,
\r
130 FILTER_SOURCE_ROUTE = 8
\r
131 } NdisPacketFilter;
\r
134 REQ_INITIATE_DIAGNOSTICS = 1,
\r
135 REQ_READ_ERROR_LOG = 2,
\r
136 REQ_SET_STATION_ADDRESS = 3,
\r
137 REQ_OPEN_ADAPTER = 4,
\r
138 REQ_CLOSE_ADAPTER = 5,
\r
140 REQ_SET_PACKET_FILTER = 7,
\r
141 REQ_ADD_MULTICAST_ADDRESS = 8,
\r
142 REQ_DELETE_MULTICAST_ADDRESS = 9,
\r
143 REQ_UPDATE_STATISTICS = 10,
\r
144 REQ_CLEAR_STATISTICS = 11,
\r
145 REQ_INTERRUPT_REQUEST = 12,
\r
146 REQ_SET_FUNCTIONAL_ADDRESS = 13,
\r
147 REQ_SET_LOOKAHEAD = 14
\r
148 } NdisGeneralRequest;
\r
151 SF_BROADCAST = 0x00000001L,
\r
152 SF_MULTICAST = 0x00000002L,
\r
153 SF_FUNCTIONAL = 0x00000004L,
\r
154 SF_PROMISCUOUS = 0x00000008L,
\r
155 SF_SOFT_ADDRESS = 0x00000010L,
\r
156 SF_STATS_CURRENT = 0x00000020L,
\r
157 SF_INITIATE_DIAGS = 0x00000040L,
\r
158 SF_LOOPBACK = 0x00000080L,
\r
159 SF_RECEIVE_CHAIN = 0x00000100L,
\r
160 SF_SOURCE_ROUTING = 0x00000200L,
\r
161 SF_RESET_MAC = 0x00000400L,
\r
162 SF_OPEN_CLOSE = 0x00000800L,
\r
163 SF_INTERRUPT_REQUEST = 0x00001000L,
\r
164 SF_SOURCE_ROUTING_BRIDGE = 0x00002000L,
\r
165 SF_VIRTUAL_ADDRESSES = 0x00004000L
\r
166 } NdisMacServiceFlags;
\r
169 REQ_INITIATE_BIND = 1,
\r
171 REQ_INITIATE_PREBIND = 3,
\r
172 REQ_INITIATE_UNBIND = 4,
\r
177 PM_GET_PROTOCOL_MANAGER_INFO = 1,
\r
178 PM_REGISTER_MODULE = 2,
\r
179 PM_BIND_AND_START = 3,
\r
180 PM_GET_PROTOCOL_MANAGER_LINKAGE = 4,
\r
181 PM_GET_PROTOCOL_INI_PATH = 5,
\r
182 PM_REGISTER_PROTOCOL_MANAGER_INFO = 6,
\r
183 PM_INIT_AND_REGISTER = 7,
\r
184 PM_UNBIND_AND_STOP = 8,
\r
185 PM_BIND_STATUS = 9,
\r
186 PM_REGISTER_STATUS = 10
\r
191 ERR_SUCCESS = 0x00,
\r
192 ERR_WAIT_FOR_RELEASE = 0x01,
\r
193 ERR_REQUEST_QUEUED = 0x02,
\r
194 ERR_FRAME_NOT_RECOGNIZED = 0x03,
\r
195 ERR_FRAME_REJECTED = 0x04,
\r
196 ERR_FORWARD_FRAME = 0x05,
\r
197 ERR_OUT_OF_RESOURCE = 0x06,
\r
198 ERR_INVALID_PARAMETER = 0x07,
\r
199 ERR_INVALID_FUNCTION = 0x08,
\r
200 ERR_NOT_SUPPORTED = 0x09,
\r
201 ERR_HARDWARE_ERROR = 0x0A,
\r
202 ERR_TRANSMIT_ERROR = 0x0B,
\r
203 ERR_NO_SUCH_DESTINATION = 0x0C,
\r
204 ERR_BUFFER_TOO_SMALL = 0x0D,
\r
205 ERR_ALREADY_STARTED = 0x20,
\r
206 ERR_INCOMPLETE_BINDING = 0x21,
\r
207 ERR_DRIVER_NOT_INITIALIZED = 0x22,
\r
208 ERR_HARDWARE_NOT_FOUND = 0x23,
\r
209 ERR_HARDWARE_FAILURE = 0x24,
\r
210 ERR_CONFIGURATION_FAILURE = 0x25,
\r
211 ERR_INTERRUPT_CONFLICT = 0x26,
\r
212 ERR_INCOMPATIBLE_MAC = 0x27,
\r
213 ERR_INITIALIZATION_FAILED = 0x28,
\r
214 ERR_NO_BINDING = 0x29,
\r
215 ERR_NETWORK_MAY_NOT_BE_CONNECTED = 0x2A,
\r
216 ERR_INCOMPATIBLE_OS_VERSION = 0x2B,
\r
217 ERR_ALREADY_REGISTERED = 0x2C,
\r
218 ERR_PATH_NOT_FOUND = 0x2D,
\r
219 ERR_INSUFFICIENT_MEMORY = 0x2E,
\r
220 ERR_INFO_NOT_FOUND = 0x2F,
\r
221 ERR_GENERAL_FAILURE = 0xFF
\r
224 #define NDIS_PARAM_INTEGER 0
\r
225 #define NDIS_PARAM_STRING 1
\r
227 #define NDIS_TX_BUF_LENGTH 8
\r
228 #define NDIS_TD_BUF_LENGTH 1
\r
229 #define NDIS_RX_BUF_LENGTH 8
\r
231 #define NDIS_PTR_PHYSICAL 0
\r
232 #define NDIS_PTR_VIRTUAL 2
\r
234 #define NDIS_PATH "PROTMAN$"
\r
237 typedef struct _CommonChars {
\r
239 BYTE majorNdisVersion; /* 2 - Latest version */
\r
240 BYTE minorNdisVersion; /* 0 */
\r
242 BYTE majorModuleVersion;
\r
243 BYTE minorModuleVersion;
\r
245 /* 0 - Binding at upper boundary supported
\r
246 * 1 - Binding at lower boundary supported
\r
247 * 2 - Dynamically bound.
\r
248 * 3-31 - Reserved, must be zero.
\r
250 BYTE moduleName[16];
\r
251 BYTE protocolLevelUpper;
\r
257 * -1 - Not specified
\r
259 BYTE interfaceUpper;
\r
260 BYTE protocolLevelLower;
\r
267 * -1 - Not specified
\r
269 BYTE interfaceLower;
\r
272 SystemRequest systemRequest;
\r
273 BYTE *serviceChars;
\r
274 BYTE *serviceStatus;
\r
275 BYTE *upperDispatchTable;
\r
276 BYTE *lowerDispatchTable;
\r
277 BYTE *reserved2; /* Must be NULL */
\r
278 BYTE *reserved3; /* Must be NULL */
\r
282 typedef struct _MulticastList {
\r
283 WORD maxMulticastAddresses;
\r
284 WORD numberMulticastAddresses;
\r
285 BYTE multicastAddress[16][16];
\r
289 typedef struct _MacChars {
\r
292 WORD addressLength;
\r
293 BYTE permanentAddress[16];
\r
294 BYTE currentAddress[16];
\r
295 DWORD currentFunctionalAddress;
\r
296 MulticastList *multicastList;
\r
298 DWORD serviceFlags;
\r
300 DWORD txBufferSize;
\r
301 WORD txBufferAllocSize;
\r
302 DWORD rxBufferSize;
\r
303 WORD rxBufferAllocSize;
\r
304 BYTE ieeeVendor[3];
\r
305 BYTE vendorAdapter;
\r
306 BYTE *vendorAdapterDescription;
\r
307 WORD interruptLevel;
\r
309 WORD maxDataBlocks;
\r
313 typedef struct _ProtocolChars {
\r
320 typedef struct _MacUpperDispatch {
\r
321 CommonChars *backPointer;
\r
323 TransmitChain transmitChain;
\r
324 TransferData transferData;
\r
325 ReceiveRelease receiveRelease;
\r
326 IndicationOn indicationOn;
\r
327 IndicationOff indicationOff;
\r
328 } MacUpperDispatch;
\r
331 typedef struct _MacStatusTable {
\r
336 BYTE *mediaSpecificStats;
\r
338 DWORD totalFramesRx;
\r
339 DWORD totalFramesCrc;
\r
340 DWORD totalBytesRx;
\r
341 DWORD totalDiscardBufSpaceRx;
\r
342 DWORD totalMulticastRx;
\r
343 DWORD totalBroadcastRx;
\r
344 DWORD obsolete1[5];
\r
345 DWORD totalDiscardHwErrorRx;
\r
346 DWORD totalFramesTx;
\r
347 DWORD totalBytesTx;
\r
348 DWORD totalMulticastTx;
\r
349 DWORD totalBroadcastTx;
\r
350 DWORD obsolete2[2];
\r
351 DWORD totalDiscardTimeoutTx;
\r
352 DWORD totalDiscardHwErrorTx;
\r
356 typedef struct _ProtDispatch {
\r
357 CommonChars *backPointer;
\r
359 /* 0 - handles non-LLC frames
\r
360 * 1 - handles specific-LSAP LLC frames
\r
361 * 2 - handles specific-LSAP LLC frames
\r
362 * 3-31 - reserved must be 0
\r
364 void (*requestConfirm) (void);
\r
365 void (*transmitConfirm) (void);
\r
366 void (*receiveLookahead) (void);
\r
367 void (*indicationComplete) (void);
\r
368 void (*receiveChain) (void);
\r
369 void (*status) (void);
\r
373 typedef struct _ReqBlock {
\r
376 BYTE FAR *pointer1;
\r
377 BYTE FAR *pointer2;
\r
382 typedef struct _TxBufDescrRec {
\r
390 typedef struct _TxBufDescr {
\r
394 TxBufDescrRec txBufDescrRec[NDIS_TX_BUF_LENGTH];
\r
398 typedef struct _TDBufDescrRec {
\r
406 typedef struct _TDBufDescr {
\r
408 TDBufDescrRec tDBufDescrRec[NDIS_TD_BUF_LENGTH];
\r
412 typedef struct _RxBufDescrRec {
\r
418 typedef struct _RxBufDescr {
\r
420 RxBufDescrRec rxBufDescrRec[NDIS_RX_BUF_LENGTH];
\r
424 typedef struct _PktBuf {
\r
425 struct _PktBuf *nextLink;
\r
426 struct _PktBuf *prevLink;
\r
435 typedef struct _CardHandle {
\r
436 BYTE moduleName[16];
\r
437 CommonChars *common;
\r
441 typedef struct _BindingsList {
\r
443 BYTE moduleName[2][16];
\r
447 typedef struct _FailingModules {
\r
448 BYTE upperModuleName[16];
\r
449 BYTE lowerModuleName[16];
\r
453 typedef union _HardwareAddress {
\r
462 typedef struct _FddiHeader {
\r
464 HardwareAddress etherDestHost;
\r
465 HardwareAddress etherSrcHost;
\r
469 typedef struct _EthernetIIHeader {
\r
470 HardwareAddress etherDestHost;
\r
471 HardwareAddress etherSrcHost;
\r
473 } EthernetIIHeader;
\r
476 typedef struct _Ieee802Dot5Header {
\r
477 HardwareAddress etherDestHost;
\r
478 HardwareAddress etherSrcHost;
\r
479 BYTE routeInfo[30];
\r
480 } Ieee802Dot5Header;
\r
483 typedef struct _Ieee802Dot2SnapHeader {
\r
484 BYTE dsap; /* 0xAA */
\r
485 BYTE ssap; /* 0xAA */
\r
486 BYTE control; /* 3 */
\r
487 BYTE protocolId[5];
\r
488 } Ieee802Dot2SnapHeader;
\r
494 extern char *NdisLastError (void);
\r
495 extern int NdisOpen (void);
\r
496 extern int NdisInit (int promis);
\r
497 extern int NdisRegisterAndBind (int promis);
\r
498 extern void NdisShutdown (void);
\r
499 extern void NdisCheckMacFeatures (struct _CardHandle *card);
\r
500 extern int NdisSendPacket (struct _PktBuf *pktBuf, int macId);
\r
503 * Assembly "glue" functions
\r
505 extern int systemRequestGlue();
\r
506 extern int requestConfirmGlue();
\r
507 extern int transmitConfirmGlue();
\r
508 extern int receiveLookaheadGlue();
\r
509 extern int indicationCompleteGlue();
\r
510 extern int receiveChainGlue();
\r
511 extern int statusGlue();
\r
517 extern int _far NdisGetLinkage (int handle, char *data, int size);
\r
519 extern int NdisGetLinkage (int handle, char *data, int size);
\r
523 * NDIS callback handlers
\r
525 CALLBACK (NdisSystemRequest (DWORD,DWORD, WORD, WORD, WORD));
\r
526 CALLBACK (NdisRequestConfirm ( WORD, WORD, WORD, WORD, WORD,WORD));
\r
527 CALLBACK (NdisTransmitConfirm ( WORD, WORD, WORD, WORD, WORD));
\r
528 CALLBACK (NdisReceiveLookahead ( WORD, WORD, WORD, BYTE*, BYTE*, WORD));
\r
529 CALLBACK (NdisReceiveChain ( WORD, WORD, WORD, struct _RxBufDescr*, BYTE*, WORD));
\r
530 CALLBACK (NdisStatusProc ( WORD, WORD, BYTE*, WORD,WORD));
\r
531 CALLBACK (NdisIndicationComplete( WORD, WORD));
\r
533 BYTE *NdisAllocStack (void);
\r
534 void NdisFreeStack (BYTE*);
\r
537 #define RENAME_ASM_SYM(x) pragma Alias(x,"@" #x "") /* prepend `@' */
\r
538 #define RENAME_C_SYM(x) pragma Alias(x,"_" #x "") /* prepend `_' */
\r
540 RENAME_ASM_SYM (systemRequestGlue);
\r
541 RENAME_ASM_SYM (requestConfirmGlue);
\r
542 RENAME_ASM_SYM (transmitConfirmGlue);
\r
543 RENAME_ASM_SYM (receiveLookaheadGlue);
\r
544 RENAME_ASM_SYM (indicationCompleteGlue);
\r
545 RENAME_ASM_SYM (receiveChainGlue);
\r
546 RENAME_ASM_SYM (statusGlue);
\r
547 RENAME_ASM_SYM (NdisGetLinkage);
\r
548 RENAME_C_SYM (NdisSystemRequest);
\r
549 RENAME_C_SYM (NdisRequestConfirm);
\r
550 RENAME_C_SYM (NdisTransmitConfirm);
\r
551 RENAME_C_SYM (NdisReceiveLookahead);
\r
552 RENAME_C_SYM (NdisIndicationComplete);
\r
553 RENAME_C_SYM (NdisReceiveChain);
\r
554 RENAME_C_SYM (NdisStatusProc);
\r
555 RENAME_C_SYM (NdisAllocStack);
\r
556 RENAME_C_SYM (NdisFreeStack);
\r