1*8b26181fSAndroid Build Coastguard Worker /*
2*8b26181fSAndroid Build Coastguard Worker * File.........: pktdrvr.c
3*8b26181fSAndroid Build Coastguard Worker *
4*8b26181fSAndroid Build Coastguard Worker * Responsible..: Gisle Vanem, [email protected]
5*8b26181fSAndroid Build Coastguard Worker *
6*8b26181fSAndroid Build Coastguard Worker * Created......: 26.Sept 1995
7*8b26181fSAndroid Build Coastguard Worker *
8*8b26181fSAndroid Build Coastguard Worker * Description..: Packet-driver interface for 16/32-bit C :
9*8b26181fSAndroid Build Coastguard Worker * Borland C/C++ 3.0+ small/large model
10*8b26181fSAndroid Build Coastguard Worker * Watcom C/C++ 11+, DOS4GW flat model
11*8b26181fSAndroid Build Coastguard Worker * Metaware HighC 3.1+ and PharLap 386|DosX
12*8b26181fSAndroid Build Coastguard Worker * GNU C/C++ 2.7+ and djgpp 2.x extender
13*8b26181fSAndroid Build Coastguard Worker *
14*8b26181fSAndroid Build Coastguard Worker * References...: PC/TCP Packet driver Specification. rev 1.09
15*8b26181fSAndroid Build Coastguard Worker * FTP Software Inc.
16*8b26181fSAndroid Build Coastguard Worker *
17*8b26181fSAndroid Build Coastguard Worker */
18*8b26181fSAndroid Build Coastguard Worker
19*8b26181fSAndroid Build Coastguard Worker #include <stdio.h>
20*8b26181fSAndroid Build Coastguard Worker #include <stdlib.h>
21*8b26181fSAndroid Build Coastguard Worker #include <string.h>
22*8b26181fSAndroid Build Coastguard Worker #include <dos.h>
23*8b26181fSAndroid Build Coastguard Worker
24*8b26181fSAndroid Build Coastguard Worker #include "pcap-dos.h"
25*8b26181fSAndroid Build Coastguard Worker #include "pcap-int.h"
26*8b26181fSAndroid Build Coastguard Worker #include "msdos/pktdrvr.h"
27*8b26181fSAndroid Build Coastguard Worker
28*8b26181fSAndroid Build Coastguard Worker #if (DOSX)
29*8b26181fSAndroid Build Coastguard Worker #define NUM_RX_BUF 32 /* # of buffers in Rx FIFO queue */
30*8b26181fSAndroid Build Coastguard Worker #else
31*8b26181fSAndroid Build Coastguard Worker #define NUM_RX_BUF 10
32*8b26181fSAndroid Build Coastguard Worker #endif
33*8b26181fSAndroid Build Coastguard Worker
34*8b26181fSAndroid Build Coastguard Worker #define DIM(x) (sizeof((x)) / sizeof(x[0]))
35*8b26181fSAndroid Build Coastguard Worker #define PUTS(s) do { \
36*8b26181fSAndroid Build Coastguard Worker if (!pktInfo.quiet) \
37*8b26181fSAndroid Build Coastguard Worker pktInfo.error ? \
38*8b26181fSAndroid Build Coastguard Worker printf ("%s: %s\n", s, pktInfo.error) : \
39*8b26181fSAndroid Build Coastguard Worker printf ("%s\n", pktInfo.error = s); \
40*8b26181fSAndroid Build Coastguard Worker } while (0)
41*8b26181fSAndroid Build Coastguard Worker
42*8b26181fSAndroid Build Coastguard Worker #if defined(__HIGHC__)
43*8b26181fSAndroid Build Coastguard Worker extern UINT _mwenv;
44*8b26181fSAndroid Build Coastguard Worker
45*8b26181fSAndroid Build Coastguard Worker #elif defined(__DJGPP__)
46*8b26181fSAndroid Build Coastguard Worker #include <stddef.h>
47*8b26181fSAndroid Build Coastguard Worker #include <dpmi.h>
48*8b26181fSAndroid Build Coastguard Worker #include <go32.h>
49*8b26181fSAndroid Build Coastguard Worker #include <pc.h>
50*8b26181fSAndroid Build Coastguard Worker #include <sys/farptr.h>
51*8b26181fSAndroid Build Coastguard Worker
52*8b26181fSAndroid Build Coastguard Worker #elif defined(__WATCOMC__)
53*8b26181fSAndroid Build Coastguard Worker #include <i86.h>
54*8b26181fSAndroid Build Coastguard Worker #include <stddef.h>
55*8b26181fSAndroid Build Coastguard Worker extern char _Extender;
56*8b26181fSAndroid Build Coastguard Worker
57*8b26181fSAndroid Build Coastguard Worker #else
58*8b26181fSAndroid Build Coastguard Worker extern void far PktReceiver (void);
59*8b26181fSAndroid Build Coastguard Worker #endif
60*8b26181fSAndroid Build Coastguard Worker
61*8b26181fSAndroid Build Coastguard Worker
62*8b26181fSAndroid Build Coastguard Worker #if (DOSX & (DJGPP|DOS4GW))
63*8b26181fSAndroid Build Coastguard Worker #include <sys/pack_on.h>
64*8b26181fSAndroid Build Coastguard Worker
65*8b26181fSAndroid Build Coastguard Worker struct DPMI_regs {
66*8b26181fSAndroid Build Coastguard Worker DWORD r_di;
67*8b26181fSAndroid Build Coastguard Worker DWORD r_si;
68*8b26181fSAndroid Build Coastguard Worker DWORD r_bp;
69*8b26181fSAndroid Build Coastguard Worker DWORD reserved;
70*8b26181fSAndroid Build Coastguard Worker DWORD r_bx;
71*8b26181fSAndroid Build Coastguard Worker DWORD r_dx;
72*8b26181fSAndroid Build Coastguard Worker DWORD r_cx;
73*8b26181fSAndroid Build Coastguard Worker DWORD r_ax;
74*8b26181fSAndroid Build Coastguard Worker WORD r_flags;
75*8b26181fSAndroid Build Coastguard Worker WORD r_es, r_ds, r_fs, r_gs;
76*8b26181fSAndroid Build Coastguard Worker WORD r_ip, r_cs, r_sp, r_ss;
77*8b26181fSAndroid Build Coastguard Worker };
78*8b26181fSAndroid Build Coastguard Worker
79*8b26181fSAndroid Build Coastguard Worker /* Data located in a real-mode segment. This becomes far at runtime
80*8b26181fSAndroid Build Coastguard Worker */
81*8b26181fSAndroid Build Coastguard Worker typedef struct { /* must match data/code in pkt_rx1.s */
82*8b26181fSAndroid Build Coastguard Worker WORD _rxOutOfs;
83*8b26181fSAndroid Build Coastguard Worker WORD _rxInOfs;
84*8b26181fSAndroid Build Coastguard Worker DWORD _pktDrop;
85*8b26181fSAndroid Build Coastguard Worker BYTE _pktTemp [20];
86*8b26181fSAndroid Build Coastguard Worker TX_ELEMENT _pktTxBuf[1];
87*8b26181fSAndroid Build Coastguard Worker RX_ELEMENT _pktRxBuf[NUM_RX_BUF];
88*8b26181fSAndroid Build Coastguard Worker WORD _dummy[2]; /* screenSeg,newInOffset */
89*8b26181fSAndroid Build Coastguard Worker BYTE _fanChars[4];
90*8b26181fSAndroid Build Coastguard Worker WORD _fanIndex;
91*8b26181fSAndroid Build Coastguard Worker BYTE _PktReceiver[15]; /* starts on a paragraph (16byte) */
92*8b26181fSAndroid Build Coastguard Worker } PktRealStub;
93*8b26181fSAndroid Build Coastguard Worker #include <sys/pack_off.h>
94*8b26181fSAndroid Build Coastguard Worker
95*8b26181fSAndroid Build Coastguard Worker static BYTE real_stub_array [] = {
96*8b26181fSAndroid Build Coastguard Worker #include "pkt_stub.inc" /* generated opcode array */
97*8b26181fSAndroid Build Coastguard Worker };
98*8b26181fSAndroid Build Coastguard Worker
99*8b26181fSAndroid Build Coastguard Worker #define rxOutOfs offsetof (PktRealStub,_rxOutOfs)
100*8b26181fSAndroid Build Coastguard Worker #define rxInOfs offsetof (PktRealStub,_rxInOfs)
101*8b26181fSAndroid Build Coastguard Worker #define PktReceiver offsetof (PktRealStub,_PktReceiver [para_skip])
102*8b26181fSAndroid Build Coastguard Worker #define pktDrop offsetof (PktRealStub,_pktDrop)
103*8b26181fSAndroid Build Coastguard Worker #define pktTemp offsetof (PktRealStub,_pktTemp)
104*8b26181fSAndroid Build Coastguard Worker #define pktTxBuf offsetof (PktRealStub,_pktTxBuf)
105*8b26181fSAndroid Build Coastguard Worker #define FIRST_RX_BUF offsetof (PktRealStub,_pktRxBuf [0])
106*8b26181fSAndroid Build Coastguard Worker #define LAST_RX_BUF offsetof (PktRealStub,_pktRxBuf [NUM_RX_BUF-1])
107*8b26181fSAndroid Build Coastguard Worker
108*8b26181fSAndroid Build Coastguard Worker #else
109*8b26181fSAndroid Build Coastguard Worker extern WORD rxOutOfs; /* offsets into pktRxBuf FIFO queue */
110*8b26181fSAndroid Build Coastguard Worker extern WORD rxInOfs;
111*8b26181fSAndroid Build Coastguard Worker extern DWORD pktDrop; /* # packets dropped in PktReceiver() */
112*8b26181fSAndroid Build Coastguard Worker extern BYTE pktRxEnd; /* marks the end of r-mode code/data */
113*8b26181fSAndroid Build Coastguard Worker
114*8b26181fSAndroid Build Coastguard Worker extern RX_ELEMENT pktRxBuf [NUM_RX_BUF]; /* PktDrvr Rx buffers */
115*8b26181fSAndroid Build Coastguard Worker extern TX_ELEMENT pktTxBuf; /* PktDrvr Tx buffer */
116*8b26181fSAndroid Build Coastguard Worker extern char pktTemp[20]; /* PktDrvr temp area */
117*8b26181fSAndroid Build Coastguard Worker
118*8b26181fSAndroid Build Coastguard Worker #define FIRST_RX_BUF (WORD) &pktRxBuf [0]
119*8b26181fSAndroid Build Coastguard Worker #define LAST_RX_BUF (WORD) &pktRxBuf [NUM_RX_BUF-1]
120*8b26181fSAndroid Build Coastguard Worker #endif
121*8b26181fSAndroid Build Coastguard Worker
122*8b26181fSAndroid Build Coastguard Worker
123*8b26181fSAndroid Build Coastguard Worker #ifdef __BORLANDC__ /* Use Borland's inline functions */
124*8b26181fSAndroid Build Coastguard Worker #define memcpy __memcpy__
125*8b26181fSAndroid Build Coastguard Worker #define memcmp __memcmp__
126*8b26181fSAndroid Build Coastguard Worker #define memset __memset__
127*8b26181fSAndroid Build Coastguard Worker #endif
128*8b26181fSAndroid Build Coastguard Worker
129*8b26181fSAndroid Build Coastguard Worker
130*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
131*8b26181fSAndroid Build Coastguard Worker extern void PktReceiver (void); /* in pkt_rx0.asm */
132*8b26181fSAndroid Build Coastguard Worker static int RealCopy (ULONG, ULONG, REALPTR*, FARPTR*, USHORT*);
133*8b26181fSAndroid Build Coastguard Worker
134*8b26181fSAndroid Build Coastguard Worker #undef FP_SEG
135*8b26181fSAndroid Build Coastguard Worker #undef FP_OFF
136*8b26181fSAndroid Build Coastguard Worker #define FP_OFF(x) ((WORD)(x))
137*8b26181fSAndroid Build Coastguard Worker #define FP_SEG(x) ((WORD)(realBase >> 16))
138*8b26181fSAndroid Build Coastguard Worker #define DOS_ADDR(s,o) (((DWORD)(s) << 16) + (WORD)(o))
139*8b26181fSAndroid Build Coastguard Worker #define r_ax eax
140*8b26181fSAndroid Build Coastguard Worker #define r_bx ebx
141*8b26181fSAndroid Build Coastguard Worker #define r_dx edx
142*8b26181fSAndroid Build Coastguard Worker #define r_cx ecx
143*8b26181fSAndroid Build Coastguard Worker #define r_si esi
144*8b26181fSAndroid Build Coastguard Worker #define r_di edi
145*8b26181fSAndroid Build Coastguard Worker #define r_ds ds
146*8b26181fSAndroid Build Coastguard Worker #define r_es es
147*8b26181fSAndroid Build Coastguard Worker LOCAL FARPTR protBase;
148*8b26181fSAndroid Build Coastguard Worker LOCAL REALPTR realBase;
149*8b26181fSAndroid Build Coastguard Worker LOCAL WORD realSeg; /* DOS para-address of allocated area */
150*8b26181fSAndroid Build Coastguard Worker LOCAL SWI_REGS reg;
151*8b26181fSAndroid Build Coastguard Worker
152*8b26181fSAndroid Build Coastguard Worker static WORD _far *rxOutOfsFp, *rxInOfsFp;
153*8b26181fSAndroid Build Coastguard Worker
154*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
155*8b26181fSAndroid Build Coastguard Worker static _go32_dpmi_seginfo rm_mem;
156*8b26181fSAndroid Build Coastguard Worker static __dpmi_regs reg;
157*8b26181fSAndroid Build Coastguard Worker static DWORD realBase;
158*8b26181fSAndroid Build Coastguard Worker static int para_skip = 0;
159*8b26181fSAndroid Build Coastguard Worker
160*8b26181fSAndroid Build Coastguard Worker #define DOS_ADDR(s,o) (((WORD)(s) << 4) + (o))
161*8b26181fSAndroid Build Coastguard Worker #define r_ax x.ax
162*8b26181fSAndroid Build Coastguard Worker #define r_bx x.bx
163*8b26181fSAndroid Build Coastguard Worker #define r_dx x.dx
164*8b26181fSAndroid Build Coastguard Worker #define r_cx x.cx
165*8b26181fSAndroid Build Coastguard Worker #define r_si x.si
166*8b26181fSAndroid Build Coastguard Worker #define r_di x.di
167*8b26181fSAndroid Build Coastguard Worker #define r_ds x.ds
168*8b26181fSAndroid Build Coastguard Worker #define r_es x.es
169*8b26181fSAndroid Build Coastguard Worker
170*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
171*8b26181fSAndroid Build Coastguard Worker LOCAL struct DPMI_regs reg;
172*8b26181fSAndroid Build Coastguard Worker LOCAL WORD rm_base_seg, rm_base_sel;
173*8b26181fSAndroid Build Coastguard Worker LOCAL DWORD realBase;
174*8b26181fSAndroid Build Coastguard Worker LOCAL int para_skip = 0;
175*8b26181fSAndroid Build Coastguard Worker
176*8b26181fSAndroid Build Coastguard Worker LOCAL DWORD dpmi_get_real_vector (int intr);
177*8b26181fSAndroid Build Coastguard Worker LOCAL WORD dpmi_real_malloc (int size, WORD *selector);
178*8b26181fSAndroid Build Coastguard Worker LOCAL void dpmi_real_free (WORD selector);
179*8b26181fSAndroid Build Coastguard Worker #define DOS_ADDR(s,o) (((DWORD)(s) << 4) + (WORD)(o))
180*8b26181fSAndroid Build Coastguard Worker
181*8b26181fSAndroid Build Coastguard Worker #else /* real-mode Borland etc. */
182*8b26181fSAndroid Build Coastguard Worker static struct {
183*8b26181fSAndroid Build Coastguard Worker WORD r_ax, r_bx, r_cx, r_dx, r_bp;
184*8b26181fSAndroid Build Coastguard Worker WORD r_si, r_di, r_ds, r_es, r_flags;
185*8b26181fSAndroid Build Coastguard Worker } reg;
186*8b26181fSAndroid Build Coastguard Worker #endif
187*8b26181fSAndroid Build Coastguard Worker
188*8b26181fSAndroid Build Coastguard Worker #ifdef __HIGHC__
189*8b26181fSAndroid Build Coastguard Worker #pragma Alias (pktDrop, "_pktDrop")
190*8b26181fSAndroid Build Coastguard Worker #pragma Alias (pktRxBuf, "_pktRxBuf")
191*8b26181fSAndroid Build Coastguard Worker #pragma Alias (pktTxBuf, "_pktTxBuf")
192*8b26181fSAndroid Build Coastguard Worker #pragma Alias (pktTemp, "_pktTemp")
193*8b26181fSAndroid Build Coastguard Worker #pragma Alias (rxOutOfs, "_rxOutOfs")
194*8b26181fSAndroid Build Coastguard Worker #pragma Alias (rxInOfs, "_rxInOfs")
195*8b26181fSAndroid Build Coastguard Worker #pragma Alias (pktRxEnd, "_pktRxEnd")
196*8b26181fSAndroid Build Coastguard Worker #pragma Alias (PktReceiver,"_PktReceiver")
197*8b26181fSAndroid Build Coastguard Worker #endif
198*8b26181fSAndroid Build Coastguard Worker
199*8b26181fSAndroid Build Coastguard Worker
200*8b26181fSAndroid Build Coastguard Worker PUBLIC PKT_STAT pktStat; /* statistics for packets */
201*8b26181fSAndroid Build Coastguard Worker PUBLIC PKT_INFO pktInfo; /* packet-driver information */
202*8b26181fSAndroid Build Coastguard Worker
203*8b26181fSAndroid Build Coastguard Worker PUBLIC PKT_RX_MODE receiveMode = PDRX_DIRECT;
204*8b26181fSAndroid Build Coastguard Worker PUBLIC ETHER myAddress = { 0, 0, 0, 0, 0, 0 };
205*8b26181fSAndroid Build Coastguard Worker PUBLIC ETHER ethBroadcast = { 255,255,255,255,255,255 };
206*8b26181fSAndroid Build Coastguard Worker
207*8b26181fSAndroid Build Coastguard Worker LOCAL struct { /* internal statistics */
208*8b26181fSAndroid Build Coastguard Worker DWORD tooSmall; /* size < ETH_MIN */
209*8b26181fSAndroid Build Coastguard Worker DWORD tooLarge; /* size > ETH_MAX */
210*8b26181fSAndroid Build Coastguard Worker DWORD badSync; /* count_1 != count_2 */
211*8b26181fSAndroid Build Coastguard Worker DWORD wrongHandle; /* upcall to wrong handle */
212*8b26181fSAndroid Build Coastguard Worker } intStat;
213*8b26181fSAndroid Build Coastguard Worker
214*8b26181fSAndroid Build Coastguard Worker /***************************************************************************/
215*8b26181fSAndroid Build Coastguard Worker
PktGetErrorStr(int errNum)216*8b26181fSAndroid Build Coastguard Worker PUBLIC const char *PktGetErrorStr (int errNum)
217*8b26181fSAndroid Build Coastguard Worker {
218*8b26181fSAndroid Build Coastguard Worker static const char *errStr[] = {
219*8b26181fSAndroid Build Coastguard Worker "",
220*8b26181fSAndroid Build Coastguard Worker "Invalid handle number",
221*8b26181fSAndroid Build Coastguard Worker "No interfaces of specified class found",
222*8b26181fSAndroid Build Coastguard Worker "No interfaces of specified type found",
223*8b26181fSAndroid Build Coastguard Worker "No interfaces of specified number found",
224*8b26181fSAndroid Build Coastguard Worker "Bad packet type specified",
225*8b26181fSAndroid Build Coastguard Worker "Interface does not support multicast",
226*8b26181fSAndroid Build Coastguard Worker "Packet driver cannot terminate",
227*8b26181fSAndroid Build Coastguard Worker "Invalid receiver mode specified",
228*8b26181fSAndroid Build Coastguard Worker "Insufficient memory space",
229*8b26181fSAndroid Build Coastguard Worker "Type previously accessed, and not released",
230*8b26181fSAndroid Build Coastguard Worker "Command out of range, or not implemented",
231*8b26181fSAndroid Build Coastguard Worker "Cannot send packet (usually hardware error)",
232*8b26181fSAndroid Build Coastguard Worker "Cannot change hardware address ( > 1 handle open)",
233*8b26181fSAndroid Build Coastguard Worker "Hardware address has bad length or format",
234*8b26181fSAndroid Build Coastguard Worker "Cannot reset interface (more than 1 handle open)",
235*8b26181fSAndroid Build Coastguard Worker "Bad Check-sum",
236*8b26181fSAndroid Build Coastguard Worker "Bad size",
237*8b26181fSAndroid Build Coastguard Worker "Bad sync" ,
238*8b26181fSAndroid Build Coastguard Worker "Source hit"
239*8b26181fSAndroid Build Coastguard Worker };
240*8b26181fSAndroid Build Coastguard Worker
241*8b26181fSAndroid Build Coastguard Worker if (errNum < 0 || errNum >= DIM(errStr))
242*8b26181fSAndroid Build Coastguard Worker return ("Unknown driver error.");
243*8b26181fSAndroid Build Coastguard Worker return (errStr [errNum]);
244*8b26181fSAndroid Build Coastguard Worker }
245*8b26181fSAndroid Build Coastguard Worker
246*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
247*8b26181fSAndroid Build Coastguard Worker
PktGetClassName(WORD class)248*8b26181fSAndroid Build Coastguard Worker PUBLIC const char *PktGetClassName (WORD class)
249*8b26181fSAndroid Build Coastguard Worker {
250*8b26181fSAndroid Build Coastguard Worker switch (class)
251*8b26181fSAndroid Build Coastguard Worker {
252*8b26181fSAndroid Build Coastguard Worker case PD_ETHER:
253*8b26181fSAndroid Build Coastguard Worker return ("DIX-Ether");
254*8b26181fSAndroid Build Coastguard Worker case PD_PRONET10:
255*8b26181fSAndroid Build Coastguard Worker return ("ProNET-10");
256*8b26181fSAndroid Build Coastguard Worker case PD_IEEE8025:
257*8b26181fSAndroid Build Coastguard Worker return ("IEEE 802.5");
258*8b26181fSAndroid Build Coastguard Worker case PD_OMNINET:
259*8b26181fSAndroid Build Coastguard Worker return ("OmniNet");
260*8b26181fSAndroid Build Coastguard Worker case PD_APPLETALK:
261*8b26181fSAndroid Build Coastguard Worker return ("AppleTalk");
262*8b26181fSAndroid Build Coastguard Worker case PD_SLIP:
263*8b26181fSAndroid Build Coastguard Worker return ("SLIP");
264*8b26181fSAndroid Build Coastguard Worker case PD_STARTLAN:
265*8b26181fSAndroid Build Coastguard Worker return ("StartLAN");
266*8b26181fSAndroid Build Coastguard Worker case PD_ARCNET:
267*8b26181fSAndroid Build Coastguard Worker return ("ArcNet");
268*8b26181fSAndroid Build Coastguard Worker case PD_AX25:
269*8b26181fSAndroid Build Coastguard Worker return ("AX.25");
270*8b26181fSAndroid Build Coastguard Worker case PD_KISS:
271*8b26181fSAndroid Build Coastguard Worker return ("KISS");
272*8b26181fSAndroid Build Coastguard Worker case PD_IEEE8023_2:
273*8b26181fSAndroid Build Coastguard Worker return ("IEEE 802.3 w/802.2 hdr");
274*8b26181fSAndroid Build Coastguard Worker case PD_FDDI8022:
275*8b26181fSAndroid Build Coastguard Worker return ("FDDI w/802.2 hdr");
276*8b26181fSAndroid Build Coastguard Worker case PD_X25:
277*8b26181fSAndroid Build Coastguard Worker return ("X.25");
278*8b26181fSAndroid Build Coastguard Worker case PD_LANstar:
279*8b26181fSAndroid Build Coastguard Worker return ("LANstar");
280*8b26181fSAndroid Build Coastguard Worker case PD_PPP:
281*8b26181fSAndroid Build Coastguard Worker return ("PPP");
282*8b26181fSAndroid Build Coastguard Worker default:
283*8b26181fSAndroid Build Coastguard Worker return ("unknown");
284*8b26181fSAndroid Build Coastguard Worker }
285*8b26181fSAndroid Build Coastguard Worker }
286*8b26181fSAndroid Build Coastguard Worker
287*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
288*8b26181fSAndroid Build Coastguard Worker
PktRXmodeStr(PKT_RX_MODE mode)289*8b26181fSAndroid Build Coastguard Worker PUBLIC char const *PktRXmodeStr (PKT_RX_MODE mode)
290*8b26181fSAndroid Build Coastguard Worker {
291*8b26181fSAndroid Build Coastguard Worker static const char *modeStr [] = {
292*8b26181fSAndroid Build Coastguard Worker "Receiver turned off",
293*8b26181fSAndroid Build Coastguard Worker "Receive only directly addressed packets",
294*8b26181fSAndroid Build Coastguard Worker "Receive direct & broadcast packets",
295*8b26181fSAndroid Build Coastguard Worker "Receive direct,broadcast and limited multicast packets",
296*8b26181fSAndroid Build Coastguard Worker "Receive direct,broadcast and all multicast packets",
297*8b26181fSAndroid Build Coastguard Worker "Receive all packets (promiscuouos mode)"
298*8b26181fSAndroid Build Coastguard Worker };
299*8b26181fSAndroid Build Coastguard Worker
300*8b26181fSAndroid Build Coastguard Worker if (mode > DIM(modeStr))
301*8b26181fSAndroid Build Coastguard Worker return ("??");
302*8b26181fSAndroid Build Coastguard Worker return (modeStr [mode-1]);
303*8b26181fSAndroid Build Coastguard Worker }
304*8b26181fSAndroid Build Coastguard Worker
305*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
306*8b26181fSAndroid Build Coastguard Worker
PktInterrupt(void)307*8b26181fSAndroid Build Coastguard Worker LOCAL __inline BOOL PktInterrupt (void)
308*8b26181fSAndroid Build Coastguard Worker {
309*8b26181fSAndroid Build Coastguard Worker BOOL okay;
310*8b26181fSAndroid Build Coastguard Worker
311*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
312*8b26181fSAndroid Build Coastguard Worker _dx_real_int ((UINT)pktInfo.intr, ®);
313*8b26181fSAndroid Build Coastguard Worker okay = ((reg.flags & 1) == 0); /* OK if carry clear */
314*8b26181fSAndroid Build Coastguard Worker
315*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
316*8b26181fSAndroid Build Coastguard Worker __dpmi_int ((int)pktInfo.intr, ®);
317*8b26181fSAndroid Build Coastguard Worker okay = ((reg.x.flags & 1) == 0);
318*8b26181fSAndroid Build Coastguard Worker
319*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
320*8b26181fSAndroid Build Coastguard Worker union REGS r;
321*8b26181fSAndroid Build Coastguard Worker struct SREGS s;
322*8b26181fSAndroid Build Coastguard Worker
323*8b26181fSAndroid Build Coastguard Worker memset (&r, 0, sizeof(r));
324*8b26181fSAndroid Build Coastguard Worker segread (&s);
325*8b26181fSAndroid Build Coastguard Worker r.w.ax = 0x300;
326*8b26181fSAndroid Build Coastguard Worker r.x.ebx = pktInfo.intr;
327*8b26181fSAndroid Build Coastguard Worker r.w.cx = 0;
328*8b26181fSAndroid Build Coastguard Worker s.es = FP_SEG (®);
329*8b26181fSAndroid Build Coastguard Worker r.x.edi = FP_OFF (®);
330*8b26181fSAndroid Build Coastguard Worker reg.r_flags = 0;
331*8b26181fSAndroid Build Coastguard Worker reg.r_ss = reg.r_sp = 0; /* DPMI host provides stack */
332*8b26181fSAndroid Build Coastguard Worker
333*8b26181fSAndroid Build Coastguard Worker int386x (0x31, &r, &r, &s);
334*8b26181fSAndroid Build Coastguard Worker okay = (!r.w.cflag);
335*8b26181fSAndroid Build Coastguard Worker
336*8b26181fSAndroid Build Coastguard Worker #else
337*8b26181fSAndroid Build Coastguard Worker reg.r_flags = 0;
338*8b26181fSAndroid Build Coastguard Worker intr (pktInfo.intr, (struct REGPACK*)®);
339*8b26181fSAndroid Build Coastguard Worker okay = ((reg.r_flags & 1) == 0);
340*8b26181fSAndroid Build Coastguard Worker #endif
341*8b26181fSAndroid Build Coastguard Worker
342*8b26181fSAndroid Build Coastguard Worker if (okay)
343*8b26181fSAndroid Build Coastguard Worker pktInfo.error = NULL;
344*8b26181fSAndroid Build Coastguard Worker else pktInfo.error = PktGetErrorStr (reg.r_dx >> 8);
345*8b26181fSAndroid Build Coastguard Worker return (okay);
346*8b26181fSAndroid Build Coastguard Worker }
347*8b26181fSAndroid Build Coastguard Worker
348*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
349*8b26181fSAndroid Build Coastguard Worker
350*8b26181fSAndroid Build Coastguard Worker /*
351*8b26181fSAndroid Build Coastguard Worker * Search for packet driver at interrupt 60h through 80h. If ASCIIZ
352*8b26181fSAndroid Build Coastguard Worker * string "PKT DRVR" found at offset 3 in the interrupt handler, return
353*8b26181fSAndroid Build Coastguard Worker * interrupt number, else return zero in pktInfo.intr
354*8b26181fSAndroid Build Coastguard Worker */
PktSearchDriver(void)355*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktSearchDriver (void)
356*8b26181fSAndroid Build Coastguard Worker {
357*8b26181fSAndroid Build Coastguard Worker BYTE intr = 0x20;
358*8b26181fSAndroid Build Coastguard Worker BOOL found = FALSE;
359*8b26181fSAndroid Build Coastguard Worker
360*8b26181fSAndroid Build Coastguard Worker while (!found && intr < 0xFF)
361*8b26181fSAndroid Build Coastguard Worker {
362*8b26181fSAndroid Build Coastguard Worker static char str[12]; /* 3 + strlen("PKT DRVR") */
363*8b26181fSAndroid Build Coastguard Worker static char pktStr[9] = "PKT DRVR"; /* ASCIIZ string at ofs 3 */
364*8b26181fSAndroid Build Coastguard Worker DWORD rp; /* in interrupt routine */
365*8b26181fSAndroid Build Coastguard Worker
366*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
367*8b26181fSAndroid Build Coastguard Worker _dx_rmiv_get (intr, &rp);
368*8b26181fSAndroid Build Coastguard Worker ReadRealMem (&str, (REALPTR)rp, sizeof(str));
369*8b26181fSAndroid Build Coastguard Worker
370*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
371*8b26181fSAndroid Build Coastguard Worker __dpmi_raddr realAdr;
372*8b26181fSAndroid Build Coastguard Worker __dpmi_get_real_mode_interrupt_vector (intr, &realAdr);
373*8b26181fSAndroid Build Coastguard Worker rp = (realAdr.segment << 4) + realAdr.offset16;
374*8b26181fSAndroid Build Coastguard Worker dosmemget (rp, sizeof(str), &str);
375*8b26181fSAndroid Build Coastguard Worker
376*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
377*8b26181fSAndroid Build Coastguard Worker rp = dpmi_get_real_vector (intr);
378*8b26181fSAndroid Build Coastguard Worker memcpy (&str, (void*)rp, sizeof(str));
379*8b26181fSAndroid Build Coastguard Worker
380*8b26181fSAndroid Build Coastguard Worker #else
381*8b26181fSAndroid Build Coastguard Worker _fmemcpy (&str, getvect(intr), sizeof(str));
382*8b26181fSAndroid Build Coastguard Worker #endif
383*8b26181fSAndroid Build Coastguard Worker
384*8b26181fSAndroid Build Coastguard Worker found = memcmp (&str[3],&pktStr,sizeof(pktStr)) == 0;
385*8b26181fSAndroid Build Coastguard Worker intr++;
386*8b26181fSAndroid Build Coastguard Worker }
387*8b26181fSAndroid Build Coastguard Worker pktInfo.intr = (found ? intr-1 : 0);
388*8b26181fSAndroid Build Coastguard Worker return (found);
389*8b26181fSAndroid Build Coastguard Worker }
390*8b26181fSAndroid Build Coastguard Worker
391*8b26181fSAndroid Build Coastguard Worker
392*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
393*8b26181fSAndroid Build Coastguard Worker
PktSetAccess(void)394*8b26181fSAndroid Build Coastguard Worker static BOOL PktSetAccess (void)
395*8b26181fSAndroid Build Coastguard Worker {
396*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0200 + pktInfo.class;
397*8b26181fSAndroid Build Coastguard Worker reg.r_bx = 0xFFFF;
398*8b26181fSAndroid Build Coastguard Worker reg.r_dx = 0;
399*8b26181fSAndroid Build Coastguard Worker reg.r_cx = 0;
400*8b26181fSAndroid Build Coastguard Worker
401*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
402*8b26181fSAndroid Build Coastguard Worker reg.ds = 0;
403*8b26181fSAndroid Build Coastguard Worker reg.esi = 0;
404*8b26181fSAndroid Build Coastguard Worker reg.es = RP_SEG (realBase);
405*8b26181fSAndroid Build Coastguard Worker reg.edi = (WORD) &PktReceiver;
406*8b26181fSAndroid Build Coastguard Worker
407*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
408*8b26181fSAndroid Build Coastguard Worker reg.x.ds = 0;
409*8b26181fSAndroid Build Coastguard Worker reg.x.si = 0;
410*8b26181fSAndroid Build Coastguard Worker reg.x.es = rm_mem.rm_segment;
411*8b26181fSAndroid Build Coastguard Worker reg.x.di = PktReceiver;
412*8b26181fSAndroid Build Coastguard Worker
413*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
414*8b26181fSAndroid Build Coastguard Worker reg.r_ds = 0;
415*8b26181fSAndroid Build Coastguard Worker reg.r_si = 0;
416*8b26181fSAndroid Build Coastguard Worker reg.r_es = rm_base_seg;
417*8b26181fSAndroid Build Coastguard Worker reg.r_di = PktReceiver;
418*8b26181fSAndroid Build Coastguard Worker
419*8b26181fSAndroid Build Coastguard Worker #else
420*8b26181fSAndroid Build Coastguard Worker reg.r_ds = 0;
421*8b26181fSAndroid Build Coastguard Worker reg.r_si = 0;
422*8b26181fSAndroid Build Coastguard Worker reg.r_es = FP_SEG (&PktReceiver);
423*8b26181fSAndroid Build Coastguard Worker reg.r_di = FP_OFF (&PktReceiver);
424*8b26181fSAndroid Build Coastguard Worker #endif
425*8b26181fSAndroid Build Coastguard Worker
426*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
427*8b26181fSAndroid Build Coastguard Worker return (FALSE);
428*8b26181fSAndroid Build Coastguard Worker
429*8b26181fSAndroid Build Coastguard Worker pktInfo.handle = reg.r_ax;
430*8b26181fSAndroid Build Coastguard Worker return (TRUE);
431*8b26181fSAndroid Build Coastguard Worker }
432*8b26181fSAndroid Build Coastguard Worker
433*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
434*8b26181fSAndroid Build Coastguard Worker
PktReleaseHandle(WORD handle)435*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktReleaseHandle (WORD handle)
436*8b26181fSAndroid Build Coastguard Worker {
437*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0300;
438*8b26181fSAndroid Build Coastguard Worker reg.r_bx = handle;
439*8b26181fSAndroid Build Coastguard Worker return PktInterrupt();
440*8b26181fSAndroid Build Coastguard Worker }
441*8b26181fSAndroid Build Coastguard Worker
442*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
443*8b26181fSAndroid Build Coastguard Worker
PktTransmit(const void * eth,int len)444*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktTransmit (const void *eth, int len)
445*8b26181fSAndroid Build Coastguard Worker {
446*8b26181fSAndroid Build Coastguard Worker if (len > ETH_MTU)
447*8b26181fSAndroid Build Coastguard Worker return (FALSE);
448*8b26181fSAndroid Build Coastguard Worker
449*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0400; /* Function 4, send pkt */
450*8b26181fSAndroid Build Coastguard Worker reg.r_cx = len; /* total size of frame */
451*8b26181fSAndroid Build Coastguard Worker
452*8b26181fSAndroid Build Coastguard Worker #if (DOSX & DJGPP)
453*8b26181fSAndroid Build Coastguard Worker dosmemput (eth, len, realBase+pktTxBuf);
454*8b26181fSAndroid Build Coastguard Worker reg.x.ds = rm_mem.rm_segment; /* DOS data segment and */
455*8b26181fSAndroid Build Coastguard Worker reg.x.si = pktTxBuf; /* DOS offset to buffer */
456*8b26181fSAndroid Build Coastguard Worker
457*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
458*8b26181fSAndroid Build Coastguard Worker memcpy ((void*)(realBase+pktTxBuf), eth, len);
459*8b26181fSAndroid Build Coastguard Worker reg.r_ds = rm_base_seg;
460*8b26181fSAndroid Build Coastguard Worker reg.r_si = pktTxBuf;
461*8b26181fSAndroid Build Coastguard Worker
462*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & PHARLAP)
463*8b26181fSAndroid Build Coastguard Worker memcpy (&pktTxBuf, eth, len);
464*8b26181fSAndroid Build Coastguard Worker reg.r_ds = FP_SEG (&pktTxBuf);
465*8b26181fSAndroid Build Coastguard Worker reg.r_si = FP_OFF (&pktTxBuf);
466*8b26181fSAndroid Build Coastguard Worker
467*8b26181fSAndroid Build Coastguard Worker #else
468*8b26181fSAndroid Build Coastguard Worker reg.r_ds = FP_SEG (eth);
469*8b26181fSAndroid Build Coastguard Worker reg.r_si = FP_OFF (eth);
470*8b26181fSAndroid Build Coastguard Worker #endif
471*8b26181fSAndroid Build Coastguard Worker
472*8b26181fSAndroid Build Coastguard Worker return PktInterrupt();
473*8b26181fSAndroid Build Coastguard Worker }
474*8b26181fSAndroid Build Coastguard Worker
475*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
476*8b26181fSAndroid Build Coastguard Worker
477*8b26181fSAndroid Build Coastguard Worker #if (DOSX & (DJGPP|DOS4GW))
CheckElement(RX_ELEMENT * rx)478*8b26181fSAndroid Build Coastguard Worker LOCAL __inline BOOL CheckElement (RX_ELEMENT *rx)
479*8b26181fSAndroid Build Coastguard Worker #else
480*8b26181fSAndroid Build Coastguard Worker LOCAL __inline BOOL CheckElement (RX_ELEMENT _far *rx)
481*8b26181fSAndroid Build Coastguard Worker #endif
482*8b26181fSAndroid Build Coastguard Worker {
483*8b26181fSAndroid Build Coastguard Worker WORD count_1, count_2;
484*8b26181fSAndroid Build Coastguard Worker
485*8b26181fSAndroid Build Coastguard Worker /*
486*8b26181fSAndroid Build Coastguard Worker * We got an upcall to the same RMCB with wrong handle.
487*8b26181fSAndroid Build Coastguard Worker * This can happen if we failed to release handle at program exit
488*8b26181fSAndroid Build Coastguard Worker */
489*8b26181fSAndroid Build Coastguard Worker if (rx->handle != pktInfo.handle)
490*8b26181fSAndroid Build Coastguard Worker {
491*8b26181fSAndroid Build Coastguard Worker pktInfo.error = "Wrong handle";
492*8b26181fSAndroid Build Coastguard Worker intStat.wrongHandle++;
493*8b26181fSAndroid Build Coastguard Worker PktReleaseHandle (rx->handle);
494*8b26181fSAndroid Build Coastguard Worker return (FALSE);
495*8b26181fSAndroid Build Coastguard Worker }
496*8b26181fSAndroid Build Coastguard Worker count_1 = rx->firstCount;
497*8b26181fSAndroid Build Coastguard Worker count_2 = rx->secondCount;
498*8b26181fSAndroid Build Coastguard Worker
499*8b26181fSAndroid Build Coastguard Worker if (count_1 != count_2)
500*8b26181fSAndroid Build Coastguard Worker {
501*8b26181fSAndroid Build Coastguard Worker pktInfo.error = "Bad sync";
502*8b26181fSAndroid Build Coastguard Worker intStat.badSync++;
503*8b26181fSAndroid Build Coastguard Worker return (FALSE);
504*8b26181fSAndroid Build Coastguard Worker }
505*8b26181fSAndroid Build Coastguard Worker if (count_1 > ETH_MAX)
506*8b26181fSAndroid Build Coastguard Worker {
507*8b26181fSAndroid Build Coastguard Worker pktInfo.error = "Large esize";
508*8b26181fSAndroid Build Coastguard Worker intStat.tooLarge++;
509*8b26181fSAndroid Build Coastguard Worker return (FALSE);
510*8b26181fSAndroid Build Coastguard Worker }
511*8b26181fSAndroid Build Coastguard Worker #if 0
512*8b26181fSAndroid Build Coastguard Worker if (count_1 < ETH_MIN)
513*8b26181fSAndroid Build Coastguard Worker {
514*8b26181fSAndroid Build Coastguard Worker pktInfo.error = "Small esize";
515*8b26181fSAndroid Build Coastguard Worker intStat.tooSmall++;
516*8b26181fSAndroid Build Coastguard Worker return (FALSE);
517*8b26181fSAndroid Build Coastguard Worker }
518*8b26181fSAndroid Build Coastguard Worker #endif
519*8b26181fSAndroid Build Coastguard Worker return (TRUE);
520*8b26181fSAndroid Build Coastguard Worker }
521*8b26181fSAndroid Build Coastguard Worker
522*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
523*8b26181fSAndroid Build Coastguard Worker
PktTerminHandle(WORD handle)524*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktTerminHandle (WORD handle)
525*8b26181fSAndroid Build Coastguard Worker {
526*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0500;
527*8b26181fSAndroid Build Coastguard Worker reg.r_bx = handle;
528*8b26181fSAndroid Build Coastguard Worker return PktInterrupt();
529*8b26181fSAndroid Build Coastguard Worker }
530*8b26181fSAndroid Build Coastguard Worker
531*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
532*8b26181fSAndroid Build Coastguard Worker
PktResetInterface(WORD handle)533*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktResetInterface (WORD handle)
534*8b26181fSAndroid Build Coastguard Worker {
535*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0700;
536*8b26181fSAndroid Build Coastguard Worker reg.r_bx = handle;
537*8b26181fSAndroid Build Coastguard Worker return PktInterrupt();
538*8b26181fSAndroid Build Coastguard Worker }
539*8b26181fSAndroid Build Coastguard Worker
540*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
541*8b26181fSAndroid Build Coastguard Worker
PktSetReceiverMode(PKT_RX_MODE mode)542*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktSetReceiverMode (PKT_RX_MODE mode)
543*8b26181fSAndroid Build Coastguard Worker {
544*8b26181fSAndroid Build Coastguard Worker if (pktInfo.class == PD_SLIP || pktInfo.class == PD_PPP)
545*8b26181fSAndroid Build Coastguard Worker return (TRUE);
546*8b26181fSAndroid Build Coastguard Worker
547*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x1400;
548*8b26181fSAndroid Build Coastguard Worker reg.r_bx = pktInfo.handle;
549*8b26181fSAndroid Build Coastguard Worker reg.r_cx = (WORD)mode;
550*8b26181fSAndroid Build Coastguard Worker
551*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
552*8b26181fSAndroid Build Coastguard Worker return (FALSE);
553*8b26181fSAndroid Build Coastguard Worker
554*8b26181fSAndroid Build Coastguard Worker receiveMode = mode;
555*8b26181fSAndroid Build Coastguard Worker return (TRUE);
556*8b26181fSAndroid Build Coastguard Worker }
557*8b26181fSAndroid Build Coastguard Worker
558*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
559*8b26181fSAndroid Build Coastguard Worker
PktGetReceiverMode(PKT_RX_MODE * mode)560*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktGetReceiverMode (PKT_RX_MODE *mode)
561*8b26181fSAndroid Build Coastguard Worker {
562*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x1500;
563*8b26181fSAndroid Build Coastguard Worker reg.r_bx = pktInfo.handle;
564*8b26181fSAndroid Build Coastguard Worker
565*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
566*8b26181fSAndroid Build Coastguard Worker return (FALSE);
567*8b26181fSAndroid Build Coastguard Worker
568*8b26181fSAndroid Build Coastguard Worker *mode = reg.r_ax;
569*8b26181fSAndroid Build Coastguard Worker return (TRUE);
570*8b26181fSAndroid Build Coastguard Worker }
571*8b26181fSAndroid Build Coastguard Worker
572*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
573*8b26181fSAndroid Build Coastguard Worker
574*8b26181fSAndroid Build Coastguard Worker static PKT_STAT initialStat; /* statistics at startup */
575*8b26181fSAndroid Build Coastguard Worker static BOOL resetStat = FALSE; /* statistics reset ? */
576*8b26181fSAndroid Build Coastguard Worker
PktGetStatistics(WORD handle)577*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktGetStatistics (WORD handle)
578*8b26181fSAndroid Build Coastguard Worker {
579*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x1800;
580*8b26181fSAndroid Build Coastguard Worker reg.r_bx = handle;
581*8b26181fSAndroid Build Coastguard Worker
582*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
583*8b26181fSAndroid Build Coastguard Worker return (FALSE);
584*8b26181fSAndroid Build Coastguard Worker
585*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
586*8b26181fSAndroid Build Coastguard Worker ReadRealMem (&pktStat, DOS_ADDR(reg.ds,reg.esi), sizeof(pktStat));
587*8b26181fSAndroid Build Coastguard Worker
588*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
589*8b26181fSAndroid Build Coastguard Worker dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktStat), &pktStat);
590*8b26181fSAndroid Build Coastguard Worker
591*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
592*8b26181fSAndroid Build Coastguard Worker memcpy (&pktStat, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktStat));
593*8b26181fSAndroid Build Coastguard Worker
594*8b26181fSAndroid Build Coastguard Worker #else
595*8b26181fSAndroid Build Coastguard Worker _fmemcpy (&pktStat, MK_FP(reg.r_ds,reg.r_si), sizeof(pktStat));
596*8b26181fSAndroid Build Coastguard Worker #endif
597*8b26181fSAndroid Build Coastguard Worker
598*8b26181fSAndroid Build Coastguard Worker return (TRUE);
599*8b26181fSAndroid Build Coastguard Worker }
600*8b26181fSAndroid Build Coastguard Worker
601*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
602*8b26181fSAndroid Build Coastguard Worker
PktSessStatistics(WORD handle)603*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktSessStatistics (WORD handle)
604*8b26181fSAndroid Build Coastguard Worker {
605*8b26181fSAndroid Build Coastguard Worker if (!PktGetStatistics(pktInfo.handle))
606*8b26181fSAndroid Build Coastguard Worker return (FALSE);
607*8b26181fSAndroid Build Coastguard Worker
608*8b26181fSAndroid Build Coastguard Worker if (resetStat)
609*8b26181fSAndroid Build Coastguard Worker {
610*8b26181fSAndroid Build Coastguard Worker pktStat.inPackets -= initialStat.inPackets;
611*8b26181fSAndroid Build Coastguard Worker pktStat.outPackets -= initialStat.outPackets;
612*8b26181fSAndroid Build Coastguard Worker pktStat.inBytes -= initialStat.inBytes;
613*8b26181fSAndroid Build Coastguard Worker pktStat.outBytes -= initialStat.outBytes;
614*8b26181fSAndroid Build Coastguard Worker pktStat.inErrors -= initialStat.inErrors;
615*8b26181fSAndroid Build Coastguard Worker pktStat.outErrors -= initialStat.outErrors;
616*8b26181fSAndroid Build Coastguard Worker pktStat.outErrors -= initialStat.outErrors;
617*8b26181fSAndroid Build Coastguard Worker pktStat.lost -= initialStat.lost;
618*8b26181fSAndroid Build Coastguard Worker }
619*8b26181fSAndroid Build Coastguard Worker return (TRUE);
620*8b26181fSAndroid Build Coastguard Worker }
621*8b26181fSAndroid Build Coastguard Worker
622*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
623*8b26181fSAndroid Build Coastguard Worker
PktResetStatistics(WORD handle)624*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktResetStatistics (WORD handle)
625*8b26181fSAndroid Build Coastguard Worker {
626*8b26181fSAndroid Build Coastguard Worker if (!PktGetStatistics(pktInfo.handle))
627*8b26181fSAndroid Build Coastguard Worker return (FALSE);
628*8b26181fSAndroid Build Coastguard Worker
629*8b26181fSAndroid Build Coastguard Worker memcpy (&initialStat, &pktStat, sizeof(initialStat));
630*8b26181fSAndroid Build Coastguard Worker resetStat = TRUE;
631*8b26181fSAndroid Build Coastguard Worker return (TRUE);
632*8b26181fSAndroid Build Coastguard Worker }
633*8b26181fSAndroid Build Coastguard Worker
634*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
635*8b26181fSAndroid Build Coastguard Worker
PktGetAddress(ETHER * addr)636*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktGetAddress (ETHER *addr)
637*8b26181fSAndroid Build Coastguard Worker {
638*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0600;
639*8b26181fSAndroid Build Coastguard Worker reg.r_bx = pktInfo.handle;
640*8b26181fSAndroid Build Coastguard Worker reg.r_cx = sizeof (*addr);
641*8b26181fSAndroid Build Coastguard Worker
642*8b26181fSAndroid Build Coastguard Worker #if (DOSX & DJGPP)
643*8b26181fSAndroid Build Coastguard Worker reg.x.es = rm_mem.rm_segment;
644*8b26181fSAndroid Build Coastguard Worker reg.x.di = pktTemp;
645*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
646*8b26181fSAndroid Build Coastguard Worker reg.r_es = rm_base_seg;
647*8b26181fSAndroid Build Coastguard Worker reg.r_di = pktTemp;
648*8b26181fSAndroid Build Coastguard Worker #else
649*8b26181fSAndroid Build Coastguard Worker reg.r_es = FP_SEG (&pktTemp);
650*8b26181fSAndroid Build Coastguard Worker reg.r_di = FP_OFF (&pktTemp); /* ES:DI = address for result */
651*8b26181fSAndroid Build Coastguard Worker #endif
652*8b26181fSAndroid Build Coastguard Worker
653*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
654*8b26181fSAndroid Build Coastguard Worker return (FALSE);
655*8b26181fSAndroid Build Coastguard Worker
656*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
657*8b26181fSAndroid Build Coastguard Worker ReadRealMem (addr, realBase + (WORD)&pktTemp, sizeof(*addr));
658*8b26181fSAndroid Build Coastguard Worker
659*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
660*8b26181fSAndroid Build Coastguard Worker dosmemget (realBase+pktTemp, sizeof(*addr), addr);
661*8b26181fSAndroid Build Coastguard Worker
662*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
663*8b26181fSAndroid Build Coastguard Worker memcpy (addr, (void*)(realBase+pktTemp), sizeof(*addr));
664*8b26181fSAndroid Build Coastguard Worker
665*8b26181fSAndroid Build Coastguard Worker #else
666*8b26181fSAndroid Build Coastguard Worker memcpy ((void*)addr, &pktTemp, sizeof(*addr));
667*8b26181fSAndroid Build Coastguard Worker #endif
668*8b26181fSAndroid Build Coastguard Worker
669*8b26181fSAndroid Build Coastguard Worker return (TRUE);
670*8b26181fSAndroid Build Coastguard Worker }
671*8b26181fSAndroid Build Coastguard Worker
672*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
673*8b26181fSAndroid Build Coastguard Worker
PktSetAddress(const ETHER * addr)674*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktSetAddress (const ETHER *addr)
675*8b26181fSAndroid Build Coastguard Worker {
676*8b26181fSAndroid Build Coastguard Worker /* copy addr to real-mode scrath area */
677*8b26181fSAndroid Build Coastguard Worker
678*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
679*8b26181fSAndroid Build Coastguard Worker WriteRealMem (realBase + (WORD)&pktTemp, (void*)addr, sizeof(*addr));
680*8b26181fSAndroid Build Coastguard Worker
681*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
682*8b26181fSAndroid Build Coastguard Worker dosmemput (addr, sizeof(*addr), realBase+pktTemp);
683*8b26181fSAndroid Build Coastguard Worker
684*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
685*8b26181fSAndroid Build Coastguard Worker memcpy ((void*)(realBase+pktTemp), addr, sizeof(*addr));
686*8b26181fSAndroid Build Coastguard Worker
687*8b26181fSAndroid Build Coastguard Worker #else
688*8b26181fSAndroid Build Coastguard Worker memcpy (&pktTemp, (void*)addr, sizeof(*addr));
689*8b26181fSAndroid Build Coastguard Worker #endif
690*8b26181fSAndroid Build Coastguard Worker
691*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x1900;
692*8b26181fSAndroid Build Coastguard Worker reg.r_cx = sizeof (*addr); /* address length */
693*8b26181fSAndroid Build Coastguard Worker
694*8b26181fSAndroid Build Coastguard Worker #if (DOSX & DJGPP)
695*8b26181fSAndroid Build Coastguard Worker reg.x.es = rm_mem.rm_segment; /* DOS offset to param */
696*8b26181fSAndroid Build Coastguard Worker reg.x.di = pktTemp; /* DOS segment to param */
697*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
698*8b26181fSAndroid Build Coastguard Worker reg.r_es = rm_base_seg;
699*8b26181fSAndroid Build Coastguard Worker reg.r_di = pktTemp;
700*8b26181fSAndroid Build Coastguard Worker #else
701*8b26181fSAndroid Build Coastguard Worker reg.r_es = FP_SEG (&pktTemp);
702*8b26181fSAndroid Build Coastguard Worker reg.r_di = FP_OFF (&pktTemp);
703*8b26181fSAndroid Build Coastguard Worker #endif
704*8b26181fSAndroid Build Coastguard Worker
705*8b26181fSAndroid Build Coastguard Worker return PktInterrupt();
706*8b26181fSAndroid Build Coastguard Worker }
707*8b26181fSAndroid Build Coastguard Worker
708*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
709*8b26181fSAndroid Build Coastguard Worker
PktGetDriverInfo(void)710*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktGetDriverInfo (void)
711*8b26181fSAndroid Build Coastguard Worker {
712*8b26181fSAndroid Build Coastguard Worker pktInfo.majVer = 0;
713*8b26181fSAndroid Build Coastguard Worker pktInfo.minVer = 0;
714*8b26181fSAndroid Build Coastguard Worker memset (&pktInfo.name, 0, sizeof(pktInfo.name));
715*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x01FF;
716*8b26181fSAndroid Build Coastguard Worker reg.r_bx = 0;
717*8b26181fSAndroid Build Coastguard Worker
718*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
719*8b26181fSAndroid Build Coastguard Worker return (FALSE);
720*8b26181fSAndroid Build Coastguard Worker
721*8b26181fSAndroid Build Coastguard Worker pktInfo.number = reg.r_cx & 0xFF;
722*8b26181fSAndroid Build Coastguard Worker pktInfo.class = reg.r_cx >> 8;
723*8b26181fSAndroid Build Coastguard Worker #if 0
724*8b26181fSAndroid Build Coastguard Worker pktInfo.minVer = reg.r_bx % 10;
725*8b26181fSAndroid Build Coastguard Worker pktInfo.majVer = reg.r_bx / 10;
726*8b26181fSAndroid Build Coastguard Worker #else
727*8b26181fSAndroid Build Coastguard Worker pktInfo.majVer = reg.r_bx; // !!
728*8b26181fSAndroid Build Coastguard Worker #endif
729*8b26181fSAndroid Build Coastguard Worker pktInfo.funcs = reg.r_ax & 0xFF;
730*8b26181fSAndroid Build Coastguard Worker pktInfo.type = reg.r_dx & 0xFF;
731*8b26181fSAndroid Build Coastguard Worker
732*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
733*8b26181fSAndroid Build Coastguard Worker ReadRealMem (&pktInfo.name, DOS_ADDR(reg.ds,reg.esi), sizeof(pktInfo.name));
734*8b26181fSAndroid Build Coastguard Worker
735*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
736*8b26181fSAndroid Build Coastguard Worker dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktInfo.name), &pktInfo.name);
737*8b26181fSAndroid Build Coastguard Worker
738*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
739*8b26181fSAndroid Build Coastguard Worker memcpy (&pktInfo.name, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktInfo.name));
740*8b26181fSAndroid Build Coastguard Worker
741*8b26181fSAndroid Build Coastguard Worker #else
742*8b26181fSAndroid Build Coastguard Worker _fmemcpy (&pktInfo.name, MK_FP(reg.r_ds,reg.r_si), sizeof(pktInfo.name));
743*8b26181fSAndroid Build Coastguard Worker #endif
744*8b26181fSAndroid Build Coastguard Worker return (TRUE);
745*8b26181fSAndroid Build Coastguard Worker }
746*8b26181fSAndroid Build Coastguard Worker
747*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
748*8b26181fSAndroid Build Coastguard Worker
PktGetDriverParam(void)749*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktGetDriverParam (void)
750*8b26181fSAndroid Build Coastguard Worker {
751*8b26181fSAndroid Build Coastguard Worker reg.r_ax = 0x0A00;
752*8b26181fSAndroid Build Coastguard Worker
753*8b26181fSAndroid Build Coastguard Worker if (!PktInterrupt())
754*8b26181fSAndroid Build Coastguard Worker return (FALSE);
755*8b26181fSAndroid Build Coastguard Worker
756*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
757*8b26181fSAndroid Build Coastguard Worker ReadRealMem (&pktInfo.majVer, DOS_ADDR(reg.es,reg.edi), PKT_PARAM_SIZE);
758*8b26181fSAndroid Build Coastguard Worker
759*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
760*8b26181fSAndroid Build Coastguard Worker dosmemget (DOS_ADDR(reg.x.es,reg.x.di), PKT_PARAM_SIZE, &pktInfo.majVer);
761*8b26181fSAndroid Build Coastguard Worker
762*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
763*8b26181fSAndroid Build Coastguard Worker memcpy (&pktInfo.majVer, (void*)DOS_ADDR(reg.r_es,reg.r_di), PKT_PARAM_SIZE);
764*8b26181fSAndroid Build Coastguard Worker
765*8b26181fSAndroid Build Coastguard Worker #else
766*8b26181fSAndroid Build Coastguard Worker _fmemcpy (&pktInfo.majVer, MK_FP(reg.r_es,reg.r_di), PKT_PARAM_SIZE);
767*8b26181fSAndroid Build Coastguard Worker #endif
768*8b26181fSAndroid Build Coastguard Worker return (TRUE);
769*8b26181fSAndroid Build Coastguard Worker }
770*8b26181fSAndroid Build Coastguard Worker
771*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
772*8b26181fSAndroid Build Coastguard Worker
773*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
PktReceive(BYTE * buf,int max)774*8b26181fSAndroid Build Coastguard Worker PUBLIC int PktReceive (BYTE *buf, int max)
775*8b26181fSAndroid Build Coastguard Worker {
776*8b26181fSAndroid Build Coastguard Worker WORD inOfs = *rxInOfsFp;
777*8b26181fSAndroid Build Coastguard Worker WORD outOfs = *rxOutOfsFp;
778*8b26181fSAndroid Build Coastguard Worker
779*8b26181fSAndroid Build Coastguard Worker if (outOfs != inOfs)
780*8b26181fSAndroid Build Coastguard Worker {
781*8b26181fSAndroid Build Coastguard Worker RX_ELEMENT _far *head = (RX_ELEMENT _far*)(protBase+outOfs);
782*8b26181fSAndroid Build Coastguard Worker int size, len = max;
783*8b26181fSAndroid Build Coastguard Worker
784*8b26181fSAndroid Build Coastguard Worker if (CheckElement(head))
785*8b26181fSAndroid Build Coastguard Worker {
786*8b26181fSAndroid Build Coastguard Worker size = min (head->firstCount, sizeof(RX_ELEMENT));
787*8b26181fSAndroid Build Coastguard Worker len = min (size, max);
788*8b26181fSAndroid Build Coastguard Worker _fmemcpy (buf, &head->destin, len);
789*8b26181fSAndroid Build Coastguard Worker }
790*8b26181fSAndroid Build Coastguard Worker else
791*8b26181fSAndroid Build Coastguard Worker size = -1;
792*8b26181fSAndroid Build Coastguard Worker
793*8b26181fSAndroid Build Coastguard Worker outOfs += sizeof (RX_ELEMENT);
794*8b26181fSAndroid Build Coastguard Worker if (outOfs > LAST_RX_BUF)
795*8b26181fSAndroid Build Coastguard Worker outOfs = FIRST_RX_BUF;
796*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp = outOfs;
797*8b26181fSAndroid Build Coastguard Worker return (size);
798*8b26181fSAndroid Build Coastguard Worker }
799*8b26181fSAndroid Build Coastguard Worker return (0);
800*8b26181fSAndroid Build Coastguard Worker }
801*8b26181fSAndroid Build Coastguard Worker
PktQueueBusy(BOOL busy)802*8b26181fSAndroid Build Coastguard Worker PUBLIC void PktQueueBusy (BOOL busy)
803*8b26181fSAndroid Build Coastguard Worker {
804*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp = busy ? (*rxInOfsFp + sizeof(RX_ELEMENT)) : *rxInOfsFp;
805*8b26181fSAndroid Build Coastguard Worker if (*rxOutOfsFp > LAST_RX_BUF)
806*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp = FIRST_RX_BUF;
807*8b26181fSAndroid Build Coastguard Worker *(DWORD _far*)(protBase + (WORD)&pktDrop) = 0;
808*8b26181fSAndroid Build Coastguard Worker }
809*8b26181fSAndroid Build Coastguard Worker
PktBuffersUsed(void)810*8b26181fSAndroid Build Coastguard Worker PUBLIC WORD PktBuffersUsed (void)
811*8b26181fSAndroid Build Coastguard Worker {
812*8b26181fSAndroid Build Coastguard Worker WORD inOfs = *rxInOfsFp;
813*8b26181fSAndroid Build Coastguard Worker WORD outOfs = *rxOutOfsFp;
814*8b26181fSAndroid Build Coastguard Worker
815*8b26181fSAndroid Build Coastguard Worker if (inOfs >= outOfs)
816*8b26181fSAndroid Build Coastguard Worker return (inOfs - outOfs) / sizeof(RX_ELEMENT);
817*8b26181fSAndroid Build Coastguard Worker return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
818*8b26181fSAndroid Build Coastguard Worker }
819*8b26181fSAndroid Build Coastguard Worker
PktRxDropped(void)820*8b26181fSAndroid Build Coastguard Worker PUBLIC DWORD PktRxDropped (void)
821*8b26181fSAndroid Build Coastguard Worker {
822*8b26181fSAndroid Build Coastguard Worker return (*(DWORD _far*)(protBase + (WORD)&pktDrop));
823*8b26181fSAndroid Build Coastguard Worker }
824*8b26181fSAndroid Build Coastguard Worker
825*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
PktReceive(BYTE * buf,int max)826*8b26181fSAndroid Build Coastguard Worker PUBLIC int PktReceive (BYTE *buf, int max)
827*8b26181fSAndroid Build Coastguard Worker {
828*8b26181fSAndroid Build Coastguard Worker WORD ofs = _farpeekw (_dos_ds, realBase+rxOutOfs);
829*8b26181fSAndroid Build Coastguard Worker
830*8b26181fSAndroid Build Coastguard Worker if (ofs != _farpeekw (_dos_ds, realBase+rxInOfs))
831*8b26181fSAndroid Build Coastguard Worker {
832*8b26181fSAndroid Build Coastguard Worker RX_ELEMENT head;
833*8b26181fSAndroid Build Coastguard Worker int size, len = max;
834*8b26181fSAndroid Build Coastguard Worker
835*8b26181fSAndroid Build Coastguard Worker head.firstCount = _farpeekw (_dos_ds, realBase+ofs);
836*8b26181fSAndroid Build Coastguard Worker head.secondCount = _farpeekw (_dos_ds, realBase+ofs+2);
837*8b26181fSAndroid Build Coastguard Worker head.handle = _farpeekw (_dos_ds, realBase+ofs+4);
838*8b26181fSAndroid Build Coastguard Worker
839*8b26181fSAndroid Build Coastguard Worker if (CheckElement(&head))
840*8b26181fSAndroid Build Coastguard Worker {
841*8b26181fSAndroid Build Coastguard Worker size = min (head.firstCount, sizeof(RX_ELEMENT));
842*8b26181fSAndroid Build Coastguard Worker len = min (size, max);
843*8b26181fSAndroid Build Coastguard Worker dosmemget (realBase+ofs+6, len, buf);
844*8b26181fSAndroid Build Coastguard Worker }
845*8b26181fSAndroid Build Coastguard Worker else
846*8b26181fSAndroid Build Coastguard Worker size = -1;
847*8b26181fSAndroid Build Coastguard Worker
848*8b26181fSAndroid Build Coastguard Worker ofs += sizeof (RX_ELEMENT);
849*8b26181fSAndroid Build Coastguard Worker if (ofs > LAST_RX_BUF)
850*8b26181fSAndroid Build Coastguard Worker _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
851*8b26181fSAndroid Build Coastguard Worker else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);
852*8b26181fSAndroid Build Coastguard Worker return (size);
853*8b26181fSAndroid Build Coastguard Worker }
854*8b26181fSAndroid Build Coastguard Worker return (0);
855*8b26181fSAndroid Build Coastguard Worker }
856*8b26181fSAndroid Build Coastguard Worker
PktQueueBusy(BOOL busy)857*8b26181fSAndroid Build Coastguard Worker PUBLIC void PktQueueBusy (BOOL busy)
858*8b26181fSAndroid Build Coastguard Worker {
859*8b26181fSAndroid Build Coastguard Worker WORD ofs;
860*8b26181fSAndroid Build Coastguard Worker
861*8b26181fSAndroid Build Coastguard Worker disable();
862*8b26181fSAndroid Build Coastguard Worker ofs = _farpeekw (_dos_ds, realBase+rxInOfs);
863*8b26181fSAndroid Build Coastguard Worker if (busy)
864*8b26181fSAndroid Build Coastguard Worker ofs += sizeof (RX_ELEMENT);
865*8b26181fSAndroid Build Coastguard Worker
866*8b26181fSAndroid Build Coastguard Worker if (ofs > LAST_RX_BUF)
867*8b26181fSAndroid Build Coastguard Worker _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
868*8b26181fSAndroid Build Coastguard Worker else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);
869*8b26181fSAndroid Build Coastguard Worker _farpokel (_dos_ds, realBase+pktDrop, 0UL);
870*8b26181fSAndroid Build Coastguard Worker enable();
871*8b26181fSAndroid Build Coastguard Worker }
872*8b26181fSAndroid Build Coastguard Worker
PktBuffersUsed(void)873*8b26181fSAndroid Build Coastguard Worker PUBLIC WORD PktBuffersUsed (void)
874*8b26181fSAndroid Build Coastguard Worker {
875*8b26181fSAndroid Build Coastguard Worker WORD inOfs, outOfs;
876*8b26181fSAndroid Build Coastguard Worker
877*8b26181fSAndroid Build Coastguard Worker disable();
878*8b26181fSAndroid Build Coastguard Worker inOfs = _farpeekw (_dos_ds, realBase+rxInOfs);
879*8b26181fSAndroid Build Coastguard Worker outOfs = _farpeekw (_dos_ds, realBase+rxOutOfs);
880*8b26181fSAndroid Build Coastguard Worker enable();
881*8b26181fSAndroid Build Coastguard Worker if (inOfs >= outOfs)
882*8b26181fSAndroid Build Coastguard Worker return (inOfs - outOfs) / sizeof(RX_ELEMENT);
883*8b26181fSAndroid Build Coastguard Worker return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
884*8b26181fSAndroid Build Coastguard Worker }
885*8b26181fSAndroid Build Coastguard Worker
PktRxDropped(void)886*8b26181fSAndroid Build Coastguard Worker PUBLIC DWORD PktRxDropped (void)
887*8b26181fSAndroid Build Coastguard Worker {
888*8b26181fSAndroid Build Coastguard Worker return _farpeekl (_dos_ds, realBase+pktDrop);
889*8b26181fSAndroid Build Coastguard Worker }
890*8b26181fSAndroid Build Coastguard Worker
891*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
PktReceive(BYTE * buf,int max)892*8b26181fSAndroid Build Coastguard Worker PUBLIC int PktReceive (BYTE *buf, int max)
893*8b26181fSAndroid Build Coastguard Worker {
894*8b26181fSAndroid Build Coastguard Worker WORD ofs = *(WORD*) (realBase+rxOutOfs);
895*8b26181fSAndroid Build Coastguard Worker
896*8b26181fSAndroid Build Coastguard Worker if (ofs != *(WORD*) (realBase+rxInOfs))
897*8b26181fSAndroid Build Coastguard Worker {
898*8b26181fSAndroid Build Coastguard Worker RX_ELEMENT head;
899*8b26181fSAndroid Build Coastguard Worker int size, len = max;
900*8b26181fSAndroid Build Coastguard Worker
901*8b26181fSAndroid Build Coastguard Worker head.firstCount = *(WORD*) (realBase+ofs);
902*8b26181fSAndroid Build Coastguard Worker head.secondCount = *(WORD*) (realBase+ofs+2);
903*8b26181fSAndroid Build Coastguard Worker head.handle = *(WORD*) (realBase+ofs+4);
904*8b26181fSAndroid Build Coastguard Worker
905*8b26181fSAndroid Build Coastguard Worker if (CheckElement(&head))
906*8b26181fSAndroid Build Coastguard Worker {
907*8b26181fSAndroid Build Coastguard Worker size = min (head.firstCount, sizeof(RX_ELEMENT));
908*8b26181fSAndroid Build Coastguard Worker len = min (size, max);
909*8b26181fSAndroid Build Coastguard Worker memcpy (buf, (const void*)(realBase+ofs+6), len);
910*8b26181fSAndroid Build Coastguard Worker }
911*8b26181fSAndroid Build Coastguard Worker else
912*8b26181fSAndroid Build Coastguard Worker size = -1;
913*8b26181fSAndroid Build Coastguard Worker
914*8b26181fSAndroid Build Coastguard Worker ofs += sizeof (RX_ELEMENT);
915*8b26181fSAndroid Build Coastguard Worker if (ofs > LAST_RX_BUF)
916*8b26181fSAndroid Build Coastguard Worker *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
917*8b26181fSAndroid Build Coastguard Worker else *(WORD*) (realBase+rxOutOfs) = ofs;
918*8b26181fSAndroid Build Coastguard Worker return (size);
919*8b26181fSAndroid Build Coastguard Worker }
920*8b26181fSAndroid Build Coastguard Worker return (0);
921*8b26181fSAndroid Build Coastguard Worker }
922*8b26181fSAndroid Build Coastguard Worker
PktQueueBusy(BOOL busy)923*8b26181fSAndroid Build Coastguard Worker PUBLIC void PktQueueBusy (BOOL busy)
924*8b26181fSAndroid Build Coastguard Worker {
925*8b26181fSAndroid Build Coastguard Worker WORD ofs;
926*8b26181fSAndroid Build Coastguard Worker
927*8b26181fSAndroid Build Coastguard Worker _disable();
928*8b26181fSAndroid Build Coastguard Worker ofs = *(WORD*) (realBase+rxInOfs);
929*8b26181fSAndroid Build Coastguard Worker if (busy)
930*8b26181fSAndroid Build Coastguard Worker ofs += sizeof (RX_ELEMENT);
931*8b26181fSAndroid Build Coastguard Worker
932*8b26181fSAndroid Build Coastguard Worker if (ofs > LAST_RX_BUF)
933*8b26181fSAndroid Build Coastguard Worker *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
934*8b26181fSAndroid Build Coastguard Worker else *(WORD*) (realBase+rxOutOfs) = ofs;
935*8b26181fSAndroid Build Coastguard Worker *(DWORD*) (realBase+pktDrop) = 0UL;
936*8b26181fSAndroid Build Coastguard Worker _enable();
937*8b26181fSAndroid Build Coastguard Worker }
938*8b26181fSAndroid Build Coastguard Worker
PktBuffersUsed(void)939*8b26181fSAndroid Build Coastguard Worker PUBLIC WORD PktBuffersUsed (void)
940*8b26181fSAndroid Build Coastguard Worker {
941*8b26181fSAndroid Build Coastguard Worker WORD inOfs, outOfs;
942*8b26181fSAndroid Build Coastguard Worker
943*8b26181fSAndroid Build Coastguard Worker _disable();
944*8b26181fSAndroid Build Coastguard Worker inOfs = *(WORD*) (realBase+rxInOfs);
945*8b26181fSAndroid Build Coastguard Worker outOfs = *(WORD*) (realBase+rxOutOfs);
946*8b26181fSAndroid Build Coastguard Worker _enable();
947*8b26181fSAndroid Build Coastguard Worker if (inOfs >= outOfs)
948*8b26181fSAndroid Build Coastguard Worker return (inOfs - outOfs) / sizeof(RX_ELEMENT);
949*8b26181fSAndroid Build Coastguard Worker return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
950*8b26181fSAndroid Build Coastguard Worker }
951*8b26181fSAndroid Build Coastguard Worker
PktRxDropped(void)952*8b26181fSAndroid Build Coastguard Worker PUBLIC DWORD PktRxDropped (void)
953*8b26181fSAndroid Build Coastguard Worker {
954*8b26181fSAndroid Build Coastguard Worker return *(DWORD*) (realBase+pktDrop);
955*8b26181fSAndroid Build Coastguard Worker }
956*8b26181fSAndroid Build Coastguard Worker
957*8b26181fSAndroid Build Coastguard Worker #else /* real-mode small/large model */
958*8b26181fSAndroid Build Coastguard Worker
PktReceive(BYTE * buf,int max)959*8b26181fSAndroid Build Coastguard Worker PUBLIC int PktReceive (BYTE *buf, int max)
960*8b26181fSAndroid Build Coastguard Worker {
961*8b26181fSAndroid Build Coastguard Worker if (rxOutOfs != rxInOfs)
962*8b26181fSAndroid Build Coastguard Worker {
963*8b26181fSAndroid Build Coastguard Worker RX_ELEMENT far *head = (RX_ELEMENT far*) MK_FP (_DS,rxOutOfs);
964*8b26181fSAndroid Build Coastguard Worker int size, len = max;
965*8b26181fSAndroid Build Coastguard Worker
966*8b26181fSAndroid Build Coastguard Worker if (CheckElement(head))
967*8b26181fSAndroid Build Coastguard Worker {
968*8b26181fSAndroid Build Coastguard Worker size = min (head->firstCount, sizeof(RX_ELEMENT));
969*8b26181fSAndroid Build Coastguard Worker len = min (size, max);
970*8b26181fSAndroid Build Coastguard Worker _fmemcpy (buf, &head->destin, len);
971*8b26181fSAndroid Build Coastguard Worker }
972*8b26181fSAndroid Build Coastguard Worker else
973*8b26181fSAndroid Build Coastguard Worker size = -1;
974*8b26181fSAndroid Build Coastguard Worker
975*8b26181fSAndroid Build Coastguard Worker rxOutOfs += sizeof (RX_ELEMENT);
976*8b26181fSAndroid Build Coastguard Worker if (rxOutOfs > LAST_RX_BUF)
977*8b26181fSAndroid Build Coastguard Worker rxOutOfs = FIRST_RX_BUF;
978*8b26181fSAndroid Build Coastguard Worker return (size);
979*8b26181fSAndroid Build Coastguard Worker }
980*8b26181fSAndroid Build Coastguard Worker return (0);
981*8b26181fSAndroid Build Coastguard Worker }
982*8b26181fSAndroid Build Coastguard Worker
PktQueueBusy(BOOL busy)983*8b26181fSAndroid Build Coastguard Worker PUBLIC void PktQueueBusy (BOOL busy)
984*8b26181fSAndroid Build Coastguard Worker {
985*8b26181fSAndroid Build Coastguard Worker rxOutOfs = busy ? (rxInOfs + sizeof(RX_ELEMENT)) : rxInOfs;
986*8b26181fSAndroid Build Coastguard Worker if (rxOutOfs > LAST_RX_BUF)
987*8b26181fSAndroid Build Coastguard Worker rxOutOfs = FIRST_RX_BUF;
988*8b26181fSAndroid Build Coastguard Worker pktDrop = 0L;
989*8b26181fSAndroid Build Coastguard Worker }
990*8b26181fSAndroid Build Coastguard Worker
PktBuffersUsed(void)991*8b26181fSAndroid Build Coastguard Worker PUBLIC WORD PktBuffersUsed (void)
992*8b26181fSAndroid Build Coastguard Worker {
993*8b26181fSAndroid Build Coastguard Worker WORD inOfs = rxInOfs;
994*8b26181fSAndroid Build Coastguard Worker WORD outOfs = rxOutOfs;
995*8b26181fSAndroid Build Coastguard Worker
996*8b26181fSAndroid Build Coastguard Worker if (inOfs >= outOfs)
997*8b26181fSAndroid Build Coastguard Worker return ((inOfs - outOfs) / sizeof(RX_ELEMENT));
998*8b26181fSAndroid Build Coastguard Worker return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
999*8b26181fSAndroid Build Coastguard Worker }
1000*8b26181fSAndroid Build Coastguard Worker
PktRxDropped(void)1001*8b26181fSAndroid Build Coastguard Worker PUBLIC DWORD PktRxDropped (void)
1002*8b26181fSAndroid Build Coastguard Worker {
1003*8b26181fSAndroid Build Coastguard Worker return (pktDrop);
1004*8b26181fSAndroid Build Coastguard Worker }
1005*8b26181fSAndroid Build Coastguard Worker #endif
1006*8b26181fSAndroid Build Coastguard Worker
1007*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
1008*8b26181fSAndroid Build Coastguard Worker
PktFreeMem(void)1009*8b26181fSAndroid Build Coastguard Worker LOCAL __inline void PktFreeMem (void)
1010*8b26181fSAndroid Build Coastguard Worker {
1011*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
1012*8b26181fSAndroid Build Coastguard Worker if (realSeg)
1013*8b26181fSAndroid Build Coastguard Worker {
1014*8b26181fSAndroid Build Coastguard Worker _dx_real_free (realSeg);
1015*8b26181fSAndroid Build Coastguard Worker realSeg = 0;
1016*8b26181fSAndroid Build Coastguard Worker }
1017*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DJGPP)
1018*8b26181fSAndroid Build Coastguard Worker if (rm_mem.rm_segment)
1019*8b26181fSAndroid Build Coastguard Worker {
1020*8b26181fSAndroid Build Coastguard Worker unsigned ofs; /* clear the DOS-mem to prevent further upcalls */
1021*8b26181fSAndroid Build Coastguard Worker
1022*8b26181fSAndroid Build Coastguard Worker for (ofs = 0; ofs < 16 * rm_mem.size / 4; ofs += 4)
1023*8b26181fSAndroid Build Coastguard Worker _farpokel (_dos_ds, realBase + ofs, 0);
1024*8b26181fSAndroid Build Coastguard Worker _go32_dpmi_free_dos_memory (&rm_mem);
1025*8b26181fSAndroid Build Coastguard Worker rm_mem.rm_segment = 0;
1026*8b26181fSAndroid Build Coastguard Worker }
1027*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
1028*8b26181fSAndroid Build Coastguard Worker if (rm_base_sel)
1029*8b26181fSAndroid Build Coastguard Worker {
1030*8b26181fSAndroid Build Coastguard Worker dpmi_real_free (rm_base_sel);
1031*8b26181fSAndroid Build Coastguard Worker rm_base_sel = 0;
1032*8b26181fSAndroid Build Coastguard Worker }
1033*8b26181fSAndroid Build Coastguard Worker #endif
1034*8b26181fSAndroid Build Coastguard Worker }
1035*8b26181fSAndroid Build Coastguard Worker
1036*8b26181fSAndroid Build Coastguard Worker /**************************************************************************/
1037*8b26181fSAndroid Build Coastguard Worker
PktExitDriver(void)1038*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktExitDriver (void)
1039*8b26181fSAndroid Build Coastguard Worker {
1040*8b26181fSAndroid Build Coastguard Worker if (pktInfo.handle)
1041*8b26181fSAndroid Build Coastguard Worker {
1042*8b26181fSAndroid Build Coastguard Worker if (!PktSetReceiverMode(PDRX_BROADCAST))
1043*8b26181fSAndroid Build Coastguard Worker PUTS ("Error restoring receiver mode.");
1044*8b26181fSAndroid Build Coastguard Worker
1045*8b26181fSAndroid Build Coastguard Worker if (!PktReleaseHandle(pktInfo.handle))
1046*8b26181fSAndroid Build Coastguard Worker PUTS ("Error releasing PKT-DRVR handle.");
1047*8b26181fSAndroid Build Coastguard Worker
1048*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1049*8b26181fSAndroid Build Coastguard Worker pktInfo.handle = 0;
1050*8b26181fSAndroid Build Coastguard Worker }
1051*8b26181fSAndroid Build Coastguard Worker
1052*8b26181fSAndroid Build Coastguard Worker if (pcap_pkt_debug >= 1)
1053*8b26181fSAndroid Build Coastguard Worker printf ("Internal stats: too-small %lu, too-large %lu, bad-sync %lu, "
1054*8b26181fSAndroid Build Coastguard Worker "wrong-handle %lu\n",
1055*8b26181fSAndroid Build Coastguard Worker intStat.tooSmall, intStat.tooLarge,
1056*8b26181fSAndroid Build Coastguard Worker intStat.badSync, intStat.wrongHandle);
1057*8b26181fSAndroid Build Coastguard Worker return (TRUE);
1058*8b26181fSAndroid Build Coastguard Worker }
1059*8b26181fSAndroid Build Coastguard Worker
1060*8b26181fSAndroid Build Coastguard Worker #if (DOSX & (DJGPP|DOS4GW))
dump_pkt_stub(void)1061*8b26181fSAndroid Build Coastguard Worker static void dump_pkt_stub (void)
1062*8b26181fSAndroid Build Coastguard Worker {
1063*8b26181fSAndroid Build Coastguard Worker int i;
1064*8b26181fSAndroid Build Coastguard Worker
1065*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "PktReceiver %lu, pkt_stub[PktReceiver] =\n",
1066*8b26181fSAndroid Build Coastguard Worker PktReceiver);
1067*8b26181fSAndroid Build Coastguard Worker for (i = 0; i < 15; i++)
1068*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "%02X, ", real_stub_array[i+PktReceiver]);
1069*8b26181fSAndroid Build Coastguard Worker fputs ("\n", stderr);
1070*8b26181fSAndroid Build Coastguard Worker }
1071*8b26181fSAndroid Build Coastguard Worker #endif
1072*8b26181fSAndroid Build Coastguard Worker
1073*8b26181fSAndroid Build Coastguard Worker /*
1074*8b26181fSAndroid Build Coastguard Worker * Front end initialization routine
1075*8b26181fSAndroid Build Coastguard Worker */
PktInitDriver(PKT_RX_MODE mode)1076*8b26181fSAndroid Build Coastguard Worker PUBLIC BOOL PktInitDriver (PKT_RX_MODE mode)
1077*8b26181fSAndroid Build Coastguard Worker {
1078*8b26181fSAndroid Build Coastguard Worker PKT_RX_MODE rxMode;
1079*8b26181fSAndroid Build Coastguard Worker BOOL writeInfo = (pcap_pkt_debug >= 3);
1080*8b26181fSAndroid Build Coastguard Worker
1081*8b26181fSAndroid Build Coastguard Worker pktInfo.quiet = (pcap_pkt_debug < 3);
1082*8b26181fSAndroid Build Coastguard Worker
1083*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP) && defined(__HIGHC__)
1084*8b26181fSAndroid Build Coastguard Worker if (_mwenv != 2)
1085*8b26181fSAndroid Build Coastguard Worker {
1086*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "Only Pharlap DOS extender supported.\n");
1087*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1088*8b26181fSAndroid Build Coastguard Worker }
1089*8b26181fSAndroid Build Coastguard Worker #endif
1090*8b26181fSAndroid Build Coastguard Worker
1091*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP) && defined(__WATCOMC__)
1092*8b26181fSAndroid Build Coastguard Worker if (_Extender != 1)
1093*8b26181fSAndroid Build Coastguard Worker {
1094*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "Only DOS4GW style extenders supported.\n");
1095*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1096*8b26181fSAndroid Build Coastguard Worker }
1097*8b26181fSAndroid Build Coastguard Worker #endif
1098*8b26181fSAndroid Build Coastguard Worker
1099*8b26181fSAndroid Build Coastguard Worker if (!PktSearchDriver())
1100*8b26181fSAndroid Build Coastguard Worker {
1101*8b26181fSAndroid Build Coastguard Worker PUTS ("Packet driver not found.");
1102*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1103*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1104*8b26181fSAndroid Build Coastguard Worker }
1105*8b26181fSAndroid Build Coastguard Worker
1106*8b26181fSAndroid Build Coastguard Worker if (!PktGetDriverInfo())
1107*8b26181fSAndroid Build Coastguard Worker {
1108*8b26181fSAndroid Build Coastguard Worker PUTS ("Error getting pkt-drvr information.");
1109*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1110*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1111*8b26181fSAndroid Build Coastguard Worker }
1112*8b26181fSAndroid Build Coastguard Worker
1113*8b26181fSAndroid Build Coastguard Worker #if (DOSX & PHARLAP)
1114*8b26181fSAndroid Build Coastguard Worker if (RealCopy((ULONG)&rxOutOfs, (ULONG)&pktRxEnd,
1115*8b26181fSAndroid Build Coastguard Worker &realBase, &protBase, (USHORT*)&realSeg))
1116*8b26181fSAndroid Build Coastguard Worker {
1117*8b26181fSAndroid Build Coastguard Worker rxOutOfsFp = (WORD _far *) (protBase + (WORD) &rxOutOfs);
1118*8b26181fSAndroid Build Coastguard Worker rxInOfsFp = (WORD _far *) (protBase + (WORD) &rxInOfs);
1119*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp = FIRST_RX_BUF;
1120*8b26181fSAndroid Build Coastguard Worker *rxInOfsFp = FIRST_RX_BUF;
1121*8b26181fSAndroid Build Coastguard Worker }
1122*8b26181fSAndroid Build Coastguard Worker else
1123*8b26181fSAndroid Build Coastguard Worker {
1124*8b26181fSAndroid Build Coastguard Worker PUTS ("Cannot allocate real-mode stub.");
1125*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1126*8b26181fSAndroid Build Coastguard Worker }
1127*8b26181fSAndroid Build Coastguard Worker
1128*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & (DJGPP|DOS4GW))
1129*8b26181fSAndroid Build Coastguard Worker if (sizeof(real_stub_array) > 0xFFFF)
1130*8b26181fSAndroid Build Coastguard Worker {
1131*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "`real_stub_array[]' too big.\n");
1132*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1133*8b26181fSAndroid Build Coastguard Worker }
1134*8b26181fSAndroid Build Coastguard Worker #if (DOSX & DJGPP)
1135*8b26181fSAndroid Build Coastguard Worker rm_mem.size = (sizeof(real_stub_array) + 15) / 16;
1136*8b26181fSAndroid Build Coastguard Worker
1137*8b26181fSAndroid Build Coastguard Worker if (_go32_dpmi_allocate_dos_memory(&rm_mem) || rm_mem.rm_offset != 0)
1138*8b26181fSAndroid Build Coastguard Worker {
1139*8b26181fSAndroid Build Coastguard Worker PUTS ("real-mode init failed.");
1140*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1141*8b26181fSAndroid Build Coastguard Worker }
1142*8b26181fSAndroid Build Coastguard Worker realBase = (rm_mem.rm_segment << 4);
1143*8b26181fSAndroid Build Coastguard Worker dosmemput (&real_stub_array, sizeof(real_stub_array), realBase);
1144*8b26181fSAndroid Build Coastguard Worker _farpokel (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
1145*8b26181fSAndroid Build Coastguard Worker _farpokel (_dos_ds, realBase+rxInOfs, FIRST_RX_BUF);
1146*8b26181fSAndroid Build Coastguard Worker
1147*8b26181fSAndroid Build Coastguard Worker #elif (DOSX & DOS4GW)
1148*8b26181fSAndroid Build Coastguard Worker rm_base_seg = dpmi_real_malloc (sizeof(real_stub_array), &rm_base_sel);
1149*8b26181fSAndroid Build Coastguard Worker if (!rm_base_seg)
1150*8b26181fSAndroid Build Coastguard Worker {
1151*8b26181fSAndroid Build Coastguard Worker PUTS ("real-mode init failed.");
1152*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1153*8b26181fSAndroid Build Coastguard Worker }
1154*8b26181fSAndroid Build Coastguard Worker realBase = (rm_base_seg << 4);
1155*8b26181fSAndroid Build Coastguard Worker memcpy ((void*)realBase, &real_stub_array, sizeof(real_stub_array));
1156*8b26181fSAndroid Build Coastguard Worker *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
1157*8b26181fSAndroid Build Coastguard Worker *(WORD*) (realBase+rxInOfs) = FIRST_RX_BUF;
1158*8b26181fSAndroid Build Coastguard Worker
1159*8b26181fSAndroid Build Coastguard Worker #endif
1160*8b26181fSAndroid Build Coastguard Worker {
1161*8b26181fSAndroid Build Coastguard Worker int pushf = PktReceiver;
1162*8b26181fSAndroid Build Coastguard Worker
1163*8b26181fSAndroid Build Coastguard Worker while (real_stub_array[pushf++] != 0x9C && /* pushf */
1164*8b26181fSAndroid Build Coastguard Worker real_stub_array[pushf] != 0xFA) /* cli */
1165*8b26181fSAndroid Build Coastguard Worker {
1166*8b26181fSAndroid Build Coastguard Worker if (++para_skip > 16)
1167*8b26181fSAndroid Build Coastguard Worker {
1168*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "Something wrong with `pkt_stub.inc'.\n");
1169*8b26181fSAndroid Build Coastguard Worker para_skip = 0;
1170*8b26181fSAndroid Build Coastguard Worker dump_pkt_stub();
1171*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1172*8b26181fSAndroid Build Coastguard Worker }
1173*8b26181fSAndroid Build Coastguard Worker }
1174*8b26181fSAndroid Build Coastguard Worker if (*(WORD*)(real_stub_array + offsetof(PktRealStub,_dummy)) != 0xB800)
1175*8b26181fSAndroid Build Coastguard Worker {
1176*8b26181fSAndroid Build Coastguard Worker fprintf (stderr, "`real_stub_array[]' is misaligned.\n");
1177*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1178*8b26181fSAndroid Build Coastguard Worker }
1179*8b26181fSAndroid Build Coastguard Worker }
1180*8b26181fSAndroid Build Coastguard Worker
1181*8b26181fSAndroid Build Coastguard Worker if (pcap_pkt_debug > 2)
1182*8b26181fSAndroid Build Coastguard Worker dump_pkt_stub();
1183*8b26181fSAndroid Build Coastguard Worker
1184*8b26181fSAndroid Build Coastguard Worker #else
1185*8b26181fSAndroid Build Coastguard Worker rxOutOfs = FIRST_RX_BUF;
1186*8b26181fSAndroid Build Coastguard Worker rxInOfs = FIRST_RX_BUF;
1187*8b26181fSAndroid Build Coastguard Worker #endif
1188*8b26181fSAndroid Build Coastguard Worker
1189*8b26181fSAndroid Build Coastguard Worker if (!PktSetAccess())
1190*8b26181fSAndroid Build Coastguard Worker {
1191*8b26181fSAndroid Build Coastguard Worker PUTS ("Error setting pkt-drvr access.");
1192*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1193*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1194*8b26181fSAndroid Build Coastguard Worker }
1195*8b26181fSAndroid Build Coastguard Worker
1196*8b26181fSAndroid Build Coastguard Worker if (!PktGetAddress(&myAddress))
1197*8b26181fSAndroid Build Coastguard Worker {
1198*8b26181fSAndroid Build Coastguard Worker PUTS ("Error fetching adapter address.");
1199*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1200*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1201*8b26181fSAndroid Build Coastguard Worker }
1202*8b26181fSAndroid Build Coastguard Worker
1203*8b26181fSAndroid Build Coastguard Worker if (!PktSetReceiverMode(mode))
1204*8b26181fSAndroid Build Coastguard Worker {
1205*8b26181fSAndroid Build Coastguard Worker PUTS ("Error setting receiver mode.");
1206*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1207*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1208*8b26181fSAndroid Build Coastguard Worker }
1209*8b26181fSAndroid Build Coastguard Worker
1210*8b26181fSAndroid Build Coastguard Worker if (!PktGetReceiverMode(&rxMode))
1211*8b26181fSAndroid Build Coastguard Worker {
1212*8b26181fSAndroid Build Coastguard Worker PUTS ("Error getting receiver mode.");
1213*8b26181fSAndroid Build Coastguard Worker PktFreeMem();
1214*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1215*8b26181fSAndroid Build Coastguard Worker }
1216*8b26181fSAndroid Build Coastguard Worker
1217*8b26181fSAndroid Build Coastguard Worker if (writeInfo)
1218*8b26181fSAndroid Build Coastguard Worker printf ("Pkt-driver information:\n"
1219*8b26181fSAndroid Build Coastguard Worker " Version : %d.%d\n"
1220*8b26181fSAndroid Build Coastguard Worker " Name : %.15s\n"
1221*8b26181fSAndroid Build Coastguard Worker " Class : %u (%s)\n"
1222*8b26181fSAndroid Build Coastguard Worker " Type : %u\n"
1223*8b26181fSAndroid Build Coastguard Worker " Number : %u\n"
1224*8b26181fSAndroid Build Coastguard Worker " Funcs : %u\n"
1225*8b26181fSAndroid Build Coastguard Worker " Intr : %Xh\n"
1226*8b26181fSAndroid Build Coastguard Worker " Handle : %u\n"
1227*8b26181fSAndroid Build Coastguard Worker " Extended : %s\n"
1228*8b26181fSAndroid Build Coastguard Worker " Hi-perf : %s\n"
1229*8b26181fSAndroid Build Coastguard Worker " RX mode : %s\n"
1230*8b26181fSAndroid Build Coastguard Worker " Eth-addr : %02X:%02X:%02X:%02X:%02X:%02X\n",
1231*8b26181fSAndroid Build Coastguard Worker
1232*8b26181fSAndroid Build Coastguard Worker pktInfo.majVer, pktInfo.minVer, pktInfo.name,
1233*8b26181fSAndroid Build Coastguard Worker pktInfo.class, PktGetClassName(pktInfo.class),
1234*8b26181fSAndroid Build Coastguard Worker pktInfo.type, pktInfo.number,
1235*8b26181fSAndroid Build Coastguard Worker pktInfo.funcs, pktInfo.intr, pktInfo.handle,
1236*8b26181fSAndroid Build Coastguard Worker pktInfo.funcs == 2 || pktInfo.funcs == 6 ? "Yes" : "No",
1237*8b26181fSAndroid Build Coastguard Worker pktInfo.funcs == 5 || pktInfo.funcs == 6 ? "Yes" : "No",
1238*8b26181fSAndroid Build Coastguard Worker PktRXmodeStr(rxMode),
1239*8b26181fSAndroid Build Coastguard Worker myAddress[0], myAddress[1], myAddress[2],
1240*8b26181fSAndroid Build Coastguard Worker myAddress[3], myAddress[4], myAddress[5]);
1241*8b26181fSAndroid Build Coastguard Worker
1242*8b26181fSAndroid Build Coastguard Worker #if defined(DEBUG) && (DOSX & PHARLAP)
1243*8b26181fSAndroid Build Coastguard Worker if (writeInfo)
1244*8b26181fSAndroid Build Coastguard Worker {
1245*8b26181fSAndroid Build Coastguard Worker DWORD rAdr = realBase + (WORD)&PktReceiver;
1246*8b26181fSAndroid Build Coastguard Worker unsigned sel, ofs;
1247*8b26181fSAndroid Build Coastguard Worker
1248*8b26181fSAndroid Build Coastguard Worker printf ("\nReceiver at %04X:%04X\n", RP_SEG(rAdr), RP_OFF(rAdr));
1249*8b26181fSAndroid Build Coastguard Worker printf ("Realbase = %04X:%04X\n", RP_SEG(realBase),RP_OFF(realBase));
1250*8b26181fSAndroid Build Coastguard Worker
1251*8b26181fSAndroid Build Coastguard Worker sel = _FP_SEG (protBase);
1252*8b26181fSAndroid Build Coastguard Worker ofs = _FP_OFF (protBase);
1253*8b26181fSAndroid Build Coastguard Worker printf ("Protbase = %04X:%08X\n", sel,ofs);
1254*8b26181fSAndroid Build Coastguard Worker printf ("RealSeg = %04X\n", realSeg);
1255*8b26181fSAndroid Build Coastguard Worker
1256*8b26181fSAndroid Build Coastguard Worker sel = _FP_SEG (rxOutOfsFp);
1257*8b26181fSAndroid Build Coastguard Worker ofs = _FP_OFF (rxOutOfsFp);
1258*8b26181fSAndroid Build Coastguard Worker printf ("rxOutOfsFp = %04X:%08X\n", sel,ofs);
1259*8b26181fSAndroid Build Coastguard Worker
1260*8b26181fSAndroid Build Coastguard Worker sel = _FP_SEG (rxInOfsFp);
1261*8b26181fSAndroid Build Coastguard Worker ofs = _FP_OFF (rxInOfsFp);
1262*8b26181fSAndroid Build Coastguard Worker printf ("rxInOfsFp = %04X:%08X\n", sel,ofs);
1263*8b26181fSAndroid Build Coastguard Worker
1264*8b26181fSAndroid Build Coastguard Worker printf ("Ready: *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",
1265*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp, *rxInOfsFp);
1266*8b26181fSAndroid Build Coastguard Worker
1267*8b26181fSAndroid Build Coastguard Worker PktQueueBusy (TRUE);
1268*8b26181fSAndroid Build Coastguard Worker printf ("Busy: *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",
1269*8b26181fSAndroid Build Coastguard Worker *rxOutOfsFp, *rxInOfsFp);
1270*8b26181fSAndroid Build Coastguard Worker }
1271*8b26181fSAndroid Build Coastguard Worker #endif
1272*8b26181fSAndroid Build Coastguard Worker
1273*8b26181fSAndroid Build Coastguard Worker memset (&pktStat, 0, sizeof(pktStat)); /* clear statistics */
1274*8b26181fSAndroid Build Coastguard Worker PktQueueBusy (TRUE);
1275*8b26181fSAndroid Build Coastguard Worker return (TRUE);
1276*8b26181fSAndroid Build Coastguard Worker }
1277*8b26181fSAndroid Build Coastguard Worker
1278*8b26181fSAndroid Build Coastguard Worker
1279*8b26181fSAndroid Build Coastguard Worker /*
1280*8b26181fSAndroid Build Coastguard Worker * DPMI functions only for Watcom + DOS4GW extenders
1281*8b26181fSAndroid Build Coastguard Worker */
1282*8b26181fSAndroid Build Coastguard Worker #if (DOSX & DOS4GW)
dpmi_get_real_vector(int intr)1283*8b26181fSAndroid Build Coastguard Worker LOCAL DWORD dpmi_get_real_vector (int intr)
1284*8b26181fSAndroid Build Coastguard Worker {
1285*8b26181fSAndroid Build Coastguard Worker union REGS r;
1286*8b26181fSAndroid Build Coastguard Worker
1287*8b26181fSAndroid Build Coastguard Worker r.x.eax = 0x200;
1288*8b26181fSAndroid Build Coastguard Worker r.x.ebx = (DWORD) intr;
1289*8b26181fSAndroid Build Coastguard Worker int386 (0x31, &r, &r);
1290*8b26181fSAndroid Build Coastguard Worker return ((r.w.cx << 4) + r.w.dx);
1291*8b26181fSAndroid Build Coastguard Worker }
1292*8b26181fSAndroid Build Coastguard Worker
dpmi_real_malloc(int size,WORD * selector)1293*8b26181fSAndroid Build Coastguard Worker LOCAL WORD dpmi_real_malloc (int size, WORD *selector)
1294*8b26181fSAndroid Build Coastguard Worker {
1295*8b26181fSAndroid Build Coastguard Worker union REGS r;
1296*8b26181fSAndroid Build Coastguard Worker
1297*8b26181fSAndroid Build Coastguard Worker r.x.eax = 0x0100; /* DPMI allocate DOS memory */
1298*8b26181fSAndroid Build Coastguard Worker r.x.ebx = (size + 15) / 16; /* Number of paragraphs requested */
1299*8b26181fSAndroid Build Coastguard Worker int386 (0x31, &r, &r);
1300*8b26181fSAndroid Build Coastguard Worker if (r.w.cflag & 1)
1301*8b26181fSAndroid Build Coastguard Worker return (0);
1302*8b26181fSAndroid Build Coastguard Worker
1303*8b26181fSAndroid Build Coastguard Worker *selector = r.w.dx;
1304*8b26181fSAndroid Build Coastguard Worker return (r.w.ax); /* Return segment address */
1305*8b26181fSAndroid Build Coastguard Worker }
1306*8b26181fSAndroid Build Coastguard Worker
dpmi_real_free(WORD selector)1307*8b26181fSAndroid Build Coastguard Worker LOCAL void dpmi_real_free (WORD selector)
1308*8b26181fSAndroid Build Coastguard Worker {
1309*8b26181fSAndroid Build Coastguard Worker union REGS r;
1310*8b26181fSAndroid Build Coastguard Worker
1311*8b26181fSAndroid Build Coastguard Worker r.x.eax = 0x101; /* DPMI free DOS memory */
1312*8b26181fSAndroid Build Coastguard Worker r.x.ebx = selector; /* Selector to free */
1313*8b26181fSAndroid Build Coastguard Worker int386 (0x31, &r, &r);
1314*8b26181fSAndroid Build Coastguard Worker }
1315*8b26181fSAndroid Build Coastguard Worker #endif
1316*8b26181fSAndroid Build Coastguard Worker
1317*8b26181fSAndroid Build Coastguard Worker
1318*8b26181fSAndroid Build Coastguard Worker #if defined(DOSX) && (DOSX & PHARLAP)
1319*8b26181fSAndroid Build Coastguard Worker /*
1320*8b26181fSAndroid Build Coastguard Worker * Description:
1321*8b26181fSAndroid Build Coastguard Worker * This routine allocates conventional memory for the specified block
1322*8b26181fSAndroid Build Coastguard Worker * of code (which must be within the first 64K of the protected mode
1323*8b26181fSAndroid Build Coastguard Worker * program segment) and copies the code to it.
1324*8b26181fSAndroid Build Coastguard Worker *
1325*8b26181fSAndroid Build Coastguard Worker * The caller should free up the conventional memory block when it
1326*8b26181fSAndroid Build Coastguard Worker * is done with the conventional memory.
1327*8b26181fSAndroid Build Coastguard Worker *
1328*8b26181fSAndroid Build Coastguard Worker * NOTE THIS ROUTINE REQUIRES 386|DOS-EXTENDER 3.0 OR LATER.
1329*8b26181fSAndroid Build Coastguard Worker *
1330*8b26181fSAndroid Build Coastguard Worker * Calling arguments:
1331*8b26181fSAndroid Build Coastguard Worker * start_offs start of real mode code in program segment
1332*8b26181fSAndroid Build Coastguard Worker * end_offs 1 byte past end of real mode code in program segment
1333*8b26181fSAndroid Build Coastguard Worker * real_basep returned; real mode ptr to use as a base for the
1334*8b26181fSAndroid Build Coastguard Worker * real mode code (eg, to get the real mode FAR
1335*8b26181fSAndroid Build Coastguard Worker * addr of a function foo(), take
1336*8b26181fSAndroid Build Coastguard Worker * real_basep + (ULONG) foo).
1337*8b26181fSAndroid Build Coastguard Worker * This pointer is constructed such that
1338*8b26181fSAndroid Build Coastguard Worker * offsets within the real mode segment are
1339*8b26181fSAndroid Build Coastguard Worker * the same as the link-time offsets in the
1340*8b26181fSAndroid Build Coastguard Worker * protected mode program segment
1341*8b26181fSAndroid Build Coastguard Worker * prot_basep returned; prot mode ptr to use as a base for getting
1342*8b26181fSAndroid Build Coastguard Worker * to the conventional memory, also constructed
1343*8b26181fSAndroid Build Coastguard Worker * so that adding the prot mode offset of a
1344*8b26181fSAndroid Build Coastguard Worker * function or variable to the base gets you a
1345*8b26181fSAndroid Build Coastguard Worker * ptr to the function or variable in the
1346*8b26181fSAndroid Build Coastguard Worker * conventional memory block.
1347*8b26181fSAndroid Build Coastguard Worker * rmem_adrp returned; real mode para addr of allocated
1348*8b26181fSAndroid Build Coastguard Worker * conventional memory block, to be used to free
1349*8b26181fSAndroid Build Coastguard Worker * up the conventional memory when done. DO NOT
1350*8b26181fSAndroid Build Coastguard Worker * USE THIS TO CONSTRUCT A REAL MODE PTR, USE
1351*8b26181fSAndroid Build Coastguard Worker * REAL_BASEP INSTEAD SO THAT OFFSETS WORK OUT
1352*8b26181fSAndroid Build Coastguard Worker * CORRECTLY.
1353*8b26181fSAndroid Build Coastguard Worker *
1354*8b26181fSAndroid Build Coastguard Worker * Returned values:
1355*8b26181fSAndroid Build Coastguard Worker * 0 if error
1356*8b26181fSAndroid Build Coastguard Worker * 1 if success
1357*8b26181fSAndroid Build Coastguard Worker */
RealCopy(ULONG start_offs,ULONG end_offs,REALPTR * real_basep,FARPTR * prot_basep,USHORT * rmem_adrp)1358*8b26181fSAndroid Build Coastguard Worker int RealCopy (ULONG start_offs,
1359*8b26181fSAndroid Build Coastguard Worker ULONG end_offs,
1360*8b26181fSAndroid Build Coastguard Worker REALPTR *real_basep,
1361*8b26181fSAndroid Build Coastguard Worker FARPTR *prot_basep,
1362*8b26181fSAndroid Build Coastguard Worker USHORT *rmem_adrp)
1363*8b26181fSAndroid Build Coastguard Worker {
1364*8b26181fSAndroid Build Coastguard Worker ULONG rm_base; /* base real mode para addr for accessing */
1365*8b26181fSAndroid Build Coastguard Worker /* allocated conventional memory */
1366*8b26181fSAndroid Build Coastguard Worker UCHAR *source; /* source pointer for copy */
1367*8b26181fSAndroid Build Coastguard Worker FARPTR destin; /* destination pointer for copy */
1368*8b26181fSAndroid Build Coastguard Worker ULONG len; /* number of bytes to copy */
1369*8b26181fSAndroid Build Coastguard Worker ULONG temp;
1370*8b26181fSAndroid Build Coastguard Worker USHORT stemp;
1371*8b26181fSAndroid Build Coastguard Worker
1372*8b26181fSAndroid Build Coastguard Worker /* First check for valid inputs
1373*8b26181fSAndroid Build Coastguard Worker */
1374*8b26181fSAndroid Build Coastguard Worker if (start_offs >= end_offs || end_offs > 0x10000)
1375*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1376*8b26181fSAndroid Build Coastguard Worker
1377*8b26181fSAndroid Build Coastguard Worker /* Round start_offs down to a paragraph (16-byte) boundary so we can set up
1378*8b26181fSAndroid Build Coastguard Worker * the real mode pointer easily. Round up end_offs to make sure we allocate
1379*8b26181fSAndroid Build Coastguard Worker * enough paragraphs
1380*8b26181fSAndroid Build Coastguard Worker */
1381*8b26181fSAndroid Build Coastguard Worker start_offs &= ~15;
1382*8b26181fSAndroid Build Coastguard Worker end_offs = (15 + (end_offs << 4)) >> 4;
1383*8b26181fSAndroid Build Coastguard Worker
1384*8b26181fSAndroid Build Coastguard Worker /* Allocate the conventional memory for our real mode code. Remember to
1385*8b26181fSAndroid Build Coastguard Worker * round byte count UP to 16-byte paragraph size. We alloc it
1386*8b26181fSAndroid Build Coastguard Worker * above the DOS data buffer so both the DOS data buffer and the appl
1387*8b26181fSAndroid Build Coastguard Worker * conventional mem block can still be resized.
1388*8b26181fSAndroid Build Coastguard Worker *
1389*8b26181fSAndroid Build Coastguard Worker * First just try to alloc it; if we can't get it, shrink the appl mem
1390*8b26181fSAndroid Build Coastguard Worker * block down to the minimum, try to alloc the memory again, then grow the
1391*8b26181fSAndroid Build Coastguard Worker * appl mem block back to the maximum. (Don't try to shrink the DOS data
1392*8b26181fSAndroid Build Coastguard Worker * buffer to free conventional memory; it wouldn't be good for this routine
1393*8b26181fSAndroid Build Coastguard Worker * to have the possible side effect of making file I/O run slower.)
1394*8b26181fSAndroid Build Coastguard Worker */
1395*8b26181fSAndroid Build Coastguard Worker len = ((end_offs - start_offs) + 15) >> 4;
1396*8b26181fSAndroid Build Coastguard Worker if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)
1397*8b26181fSAndroid Build Coastguard Worker {
1398*8b26181fSAndroid Build Coastguard Worker if (_dx_cmem_usage(0, 0, &temp, &temp) != _DOSE_NONE)
1399*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1400*8b26181fSAndroid Build Coastguard Worker
1401*8b26181fSAndroid Build Coastguard Worker if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)
1402*8b26181fSAndroid Build Coastguard Worker *rmem_adrp = 0;
1403*8b26181fSAndroid Build Coastguard Worker
1404*8b26181fSAndroid Build Coastguard Worker if (_dx_cmem_usage(0, 1, &temp, &temp) != _DOSE_NONE)
1405*8b26181fSAndroid Build Coastguard Worker {
1406*8b26181fSAndroid Build Coastguard Worker if (*rmem_adrp != 0)
1407*8b26181fSAndroid Build Coastguard Worker _dx_real_free (*rmem_adrp);
1408*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1409*8b26181fSAndroid Build Coastguard Worker }
1410*8b26181fSAndroid Build Coastguard Worker
1411*8b26181fSAndroid Build Coastguard Worker if (*rmem_adrp == 0)
1412*8b26181fSAndroid Build Coastguard Worker return (FALSE);
1413*8b26181fSAndroid Build Coastguard Worker }
1414*8b26181fSAndroid Build Coastguard Worker
1415*8b26181fSAndroid Build Coastguard Worker /* Construct real mode & protected mode pointers to access the allocated
1416*8b26181fSAndroid Build Coastguard Worker * memory. Note we know start_offs is aligned on a paragraph (16-byte)
1417*8b26181fSAndroid Build Coastguard Worker * boundary, because we rounded it down.
1418*8b26181fSAndroid Build Coastguard Worker *
1419*8b26181fSAndroid Build Coastguard Worker * We make the offsets come out rights by backing off the real mode selector
1420*8b26181fSAndroid Build Coastguard Worker * by start_offs.
1421*8b26181fSAndroid Build Coastguard Worker */
1422*8b26181fSAndroid Build Coastguard Worker rm_base = ((ULONG) *rmem_adrp) - (start_offs >> 4);
1423*8b26181fSAndroid Build Coastguard Worker RP_SET (*real_basep, 0, rm_base);
1424*8b26181fSAndroid Build Coastguard Worker FP_SET (*prot_basep, rm_base << 4, SS_DOSMEM);
1425*8b26181fSAndroid Build Coastguard Worker
1426*8b26181fSAndroid Build Coastguard Worker /* Copy the real mode code/data to the allocated memory
1427*8b26181fSAndroid Build Coastguard Worker */
1428*8b26181fSAndroid Build Coastguard Worker source = (UCHAR *) start_offs;
1429*8b26181fSAndroid Build Coastguard Worker destin = *prot_basep;
1430*8b26181fSAndroid Build Coastguard Worker FP_SET (destin, FP_OFF(*prot_basep) + start_offs, FP_SEL(*prot_basep));
1431*8b26181fSAndroid Build Coastguard Worker len = end_offs - start_offs;
1432*8b26181fSAndroid Build Coastguard Worker WriteFarMem (destin, source, len);
1433*8b26181fSAndroid Build Coastguard Worker
1434*8b26181fSAndroid Build Coastguard Worker return (TRUE);
1435*8b26181fSAndroid Build Coastguard Worker }
1436*8b26181fSAndroid Build Coastguard Worker #endif /* DOSX && (DOSX & PHARLAP) */
1437