xref: /aosp_15_r20/external/libpcap/msdos/pktdrvr.c (revision 8b26181f966a6af5cf6981a6f474313de533bb28)
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, &reg);
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, &reg);
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 (&reg);
329*8b26181fSAndroid Build Coastguard Worker   r.x.edi = FP_OFF (&reg);
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*)&reg);
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