1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *  File.........: pktdrvr.c
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *  Responsible..: Gisle Vanem,  giva@bgnett.no
5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *  Created......: 26.Sept 1995
7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *  Description..: Packet-driver interface for 16/32-bit C :
9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                 Borland C/C++ 3.0+ small/large model
10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                 Watcom C/C++ 11+, DOS4GW flat model
11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                 Metaware HighC 3.1+ and PharLap 386|DosX
12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                 GNU C/C++ 2.7+ and djgpp 2.x extender
13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *  References...: PC/TCP Packet driver Specification. rev 1.09
15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                 FTP Software Inc.
16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdio.h>
20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdlib.h>
21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <string.h>
22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <dos.h>
23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "pcap-dos.h"
25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "pcap-int.h"
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "msdos/pktdrvr.h"
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX)
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define NUM_RX_BUF  32      /* # of buffers in Rx FIFO queue */
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define NUM_RX_BUF  10
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define DIM(x)   (sizeof((x)) / sizeof(x[0]))
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define PUTS(s)  do {                                           \
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                   if (!pktInfo.quiet)                          \
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                      pktInfo.error ?                           \
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                        printf ("%s: %s\n", s, pktInfo.error) : \
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                        printf ("%s\n", pktInfo.error = s);     \
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                 } while (0)
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(__HIGHC__)
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern UINT _mwenv;
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif defined(__DJGPP__)
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <stddef.h>
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <dpmi.h>
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <go32.h>
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <pc.h>
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <sys/farptr.h>
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif defined(__WATCOMC__)
53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <i86.h>
54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <stddef.h>
55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern char _Extender;
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern void far PktReceiver (void);
59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & (DJGPP|DOS4GW))
63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <sys/pack_on.h>
64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  struct DPMI_regs {
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_di;
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_si;
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_bp;
69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  reserved;
70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_bx;
71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_dx;
72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_cx;
73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         DWORD  r_ax;
74511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         WORD   r_flags;
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         WORD   r_es, r_ds, r_fs, r_gs;
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         WORD   r_ip, r_cs, r_sp, r_ss;
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       };
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* Data located in a real-mode segment. This becomes far at runtime
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  typedef struct  {          /* must match data/code in pkt_rx1.s */
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          WORD       _rxOutOfs;
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          WORD       _rxInOfs;
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          DWORD      _pktDrop;
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          BYTE       _pktTemp [20];
86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          TX_ELEMENT _pktTxBuf[1];
87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          RX_ELEMENT _pktRxBuf[NUM_RX_BUF];
88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          WORD       _dummy[2];        /* screenSeg,newInOffset */
89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          BYTE       _fanChars[4];
90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          WORD       _fanIndex;
91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          BYTE       _PktReceiver[15]; /* starts on a paragraph (16byte) */
92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        } PktRealStub;
93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #include <sys/pack_off.h>
94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static BYTE real_stub_array [] = {
96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         #include "pkt_stub.inc"       /* generated opcode array */
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       };
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define rxOutOfs      offsetof (PktRealStub,_rxOutOfs)
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define rxInOfs       offsetof (PktRealStub,_rxInOfs)
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define PktReceiver   offsetof (PktRealStub,_PktReceiver [para_skip])
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define pktDrop       offsetof (PktRealStub,_pktDrop)
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define pktTemp       offsetof (PktRealStub,_pktTemp)
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define pktTxBuf      offsetof (PktRealStub,_pktTxBuf)
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define FIRST_RX_BUF  offsetof (PktRealStub,_pktRxBuf [0])
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define LAST_RX_BUF   offsetof (PktRealStub,_pktRxBuf [NUM_RX_BUF-1])
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern WORD       rxOutOfs;    /* offsets into pktRxBuf FIFO queue   */
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern WORD       rxInOfs;
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern DWORD      pktDrop;     /* # packets dropped in PktReceiver() */
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern BYTE       pktRxEnd;    /* marks the end of r-mode code/data  */
113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern RX_ELEMENT pktRxBuf [NUM_RX_BUF];       /* PktDrvr Rx buffers */
115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern TX_ELEMENT pktTxBuf;                    /* PktDrvr Tx buffer  */
116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern char       pktTemp[20];                 /* PktDrvr temp area  */
117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define FIRST_RX_BUF (WORD) &pktRxBuf [0]
119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define LAST_RX_BUF  (WORD) &pktRxBuf [NUM_RX_BUF-1]
120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __BORLANDC__           /* Use Borland's inline functions */
124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define memcpy  __memcpy__
125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define memcmp  __memcmp__
126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define memset  __memset__
127511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
128511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
129511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
131511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  extern void PktReceiver (void);     /* in pkt_rx0.asm */
132511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static int  RealCopy    (ULONG, ULONG, REALPTR*, FARPTR*, USHORT*);
133511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
134511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #undef  FP_SEG
135511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #undef  FP_OFF
136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define FP_OFF(x)     ((WORD)(x))
137511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define FP_SEG(x)     ((WORD)(realBase >> 16))
138511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define DOS_ADDR(s,o) (((DWORD)(s) << 16) + (WORD)(o))
139511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_ax          eax
140511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_bx          ebx
141511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_dx          edx
142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_cx          ecx
143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_si          esi
144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_di          edi
145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_ds          ds
146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_es          es
147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL FARPTR          protBase;
148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL REALPTR         realBase;
149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL WORD            realSeg;   /* DOS para-address of allocated area */
150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL SWI_REGS        reg;
151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static WORD _far *rxOutOfsFp, *rxInOfsFp;
153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static _go32_dpmi_seginfo rm_mem;
156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static __dpmi_regs        reg;
157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static DWORD              realBase;
158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static int                para_skip = 0;
159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define DOS_ADDR(s,o)     (((WORD)(s) << 4) + (o))
161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_ax              x.ax
162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_bx              x.bx
163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_dx              x.dx
164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_cx              x.cx
165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_si              x.si
166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_di              x.di
167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_ds              x.ds
168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define r_es              x.es
169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL struct DPMI_regs    reg;
172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL WORD                rm_base_seg, rm_base_sel;
173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL DWORD               realBase;
174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL int                 para_skip = 0;
175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL DWORD dpmi_get_real_vector (int intr);
177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL WORD  dpmi_real_malloc     (int size, WORD *selector);
178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LOCAL void  dpmi_real_free       (WORD selector);
179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #define DOS_ADDR(s,o) (((DWORD)(s) << 4) + (WORD)(o))
180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else              /* real-mode Borland etc. */
182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static struct  {
183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         WORD r_ax, r_bx, r_cx, r_dx, r_bp;
184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         WORD r_si, r_di, r_ds, r_es, r_flags;
185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       } reg;
186511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
187511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
188511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __HIGHC__
189511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (pktDrop,    "_pktDrop")
190511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (pktRxBuf,   "_pktRxBuf")
191511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (pktTxBuf,   "_pktTxBuf")
192511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (pktTemp,    "_pktTemp")
193511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (rxOutOfs,   "_rxOutOfs")
194511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (rxInOfs,    "_rxInOfs")
195511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (pktRxEnd,   "_pktRxEnd")
196511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  #pragma Alias (PktReceiver,"_PktReceiver")
197511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
198511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
199511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
200511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC PKT_STAT    pktStat;    /* statistics for packets    */
201511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC PKT_INFO    pktInfo;    /* packet-driver information */
202511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
203511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC PKT_RX_MODE receiveMode  = PDRX_DIRECT;
204511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC ETHER       myAddress    = {   0,  0,  0,  0,  0,  0 };
205511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC ETHER       ethBroadcast = { 255,255,255,255,255,255 };
206511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
207511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL  struct {             /* internal statistics */
208511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       DWORD  tooSmall;     /* size < ETH_MIN */
209511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       DWORD  tooLarge;     /* size > ETH_MAX */
210511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       DWORD  badSync;      /* count_1 != count_2 */
211511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       DWORD  wrongHandle;  /* upcall to wrong handle */
212511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     } intStat;
213511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
214511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/***************************************************************************/
215511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
216511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC const char *PktGetErrorStr (int errNum)
217511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
218511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static const char *errStr[] = {
219511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "",
220511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Invalid handle number",
221511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "No interfaces of specified class found",
222511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "No interfaces of specified type found",
223511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "No interfaces of specified number found",
224511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Bad packet type specified",
225511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Interface does not support multicast",
226511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Packet driver cannot terminate",
227511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Invalid receiver mode specified",
228511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Insufficient memory space",
229511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Type previously accessed, and not released",
230511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Command out of range, or not implemented",
231511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Cannot send packet (usually hardware error)",
232511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Cannot change hardware address ( > 1 handle open)",
233511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Hardware address has bad length or format",
234511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Cannot reset interface (more than 1 handle open)",
235511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Bad Check-sum",
236511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Bad size",
237511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Bad sync" ,
238511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Source hit"
239511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                  };
240511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
241511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (errNum < 0 || errNum >= DIM(errStr))
242511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return ("Unknown driver error.");
243511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (errStr [errNum]);
244511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
245511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
246511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
247511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
248511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC const char *PktGetClassName (WORD class)
249511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
250511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  switch (class)
251511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
252511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_ETHER:
253511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("DIX-Ether");
254511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_PRONET10:
255511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("ProNET-10");
256511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_IEEE8025:
257511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("IEEE 802.5");
258511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_OMNINET:
259511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("OmniNet");
260511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_APPLETALK:
261511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("AppleTalk");
262511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_SLIP:
263511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("SLIP");
264511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_STARTLAN:
265511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("StartLAN");
266511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_ARCNET:
267511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("ArcNet");
268511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_AX25:
269511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("AX.25");
270511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_KISS:
271511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("KISS");
272511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_IEEE8023_2:
273511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("IEEE 802.3 w/802.2 hdr");
274511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_FDDI8022:
275511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("FDDI w/802.2 hdr");
276511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_X25:
277511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("X.25");
278511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_LANstar:
279511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("LANstar");
280511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    case PD_PPP:
281511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("PPP");
282511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    default:
283511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         return ("unknown");
284511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
285511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
286511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
287511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
288511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
289511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC char const *PktRXmodeStr (PKT_RX_MODE mode)
290511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
291511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  static const char *modeStr [] = {
292511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receiver turned off",
293511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receive only directly addressed packets",
294511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receive direct & broadcast packets",
295511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receive direct,broadcast and limited multicast packets",
296511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receive direct,broadcast and all multicast packets",
297511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                    "Receive all packets (promiscuouos mode)"
298511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                  };
299511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
300511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (mode > DIM(modeStr))
301511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return ("??");
302511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (modeStr [mode-1]);
303511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
304511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
305511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
306511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
307511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL __inline BOOL PktInterrupt (void)
308511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
309511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  BOOL okay;
310511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
311511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
312511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _dx_real_int ((UINT)pktInfo.intr, &reg);
313511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  okay = ((reg.flags & 1) == 0);  /* OK if carry clear */
314511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
315511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
316511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  __dpmi_int ((int)pktInfo.intr, &reg);
317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  okay = ((reg.x.flags & 1) == 0);
318511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
319511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
320511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  union  REGS  r;
321511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  struct SREGS s;
322511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
323511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memset (&r, 0, sizeof(r));
324511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  segread (&s);
325511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.w.ax  = 0x300;
326511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.ebx = pktInfo.intr;
327511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.w.cx  = 0;
328511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  s.es    = FP_SEG (&reg);
329511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.edi = FP_OFF (&reg);
330511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_flags = 0;
331511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ss = reg.r_sp = 0;     /* DPMI host provides stack */
332511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
333511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  int386x (0x31, &r, &r, &s);
334511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  okay = (!r.w.cflag);
335511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
336511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
337511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_flags = 0;
338511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  intr (pktInfo.intr, (struct REGPACK*)&reg);
339511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  okay = ((reg.r_flags & 1) == 0);
340511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
341511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
342511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (okay)
343511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       pktInfo.error = NULL;
344511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  else pktInfo.error = PktGetErrorStr (reg.r_dx >> 8);
345511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (okay);
346511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
347511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
348511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
349511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
350511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
351511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Search for packet driver at interrupt 60h through 80h. If ASCIIZ
352511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * string "PKT DRVR" found at offset 3 in the interrupt handler, return
353511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * interrupt number, else return zero in pktInfo.intr
354511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
355511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktSearchDriver (void)
356511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
357511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  BYTE intr  = 0x20;
358511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  BOOL found = FALSE;
359511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
360511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  while (!found && intr < 0xFF)
361511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
362511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    static char str[12];                 /* 3 + strlen("PKT DRVR") */
363511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    static char pktStr[9] = "PKT DRVR";  /* ASCIIZ string at ofs 3 */
364511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    DWORD  rp;                           /* in interrupt  routine  */
365511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
366511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
367511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _dx_rmiv_get (intr, &rp);
368511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ReadRealMem (&str, (REALPTR)rp, sizeof(str));
369511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
370511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
371511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    __dpmi_raddr realAdr;
372511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    __dpmi_get_real_mode_interrupt_vector (intr, &realAdr);
373511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rp = (realAdr.segment << 4) + realAdr.offset16;
374511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    dosmemget (rp, sizeof(str), &str);
375511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
376511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
377511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rp = dpmi_get_real_vector (intr);
378511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    memcpy (&str, (void*)rp, sizeof(str));
379511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
380511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
381511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _fmemcpy (&str, getvect(intr), sizeof(str));
382511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
383511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
384511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    found = memcmp (&str[3],&pktStr,sizeof(pktStr)) == 0;
385511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    intr++;
386511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
387511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.intr = (found ? intr-1 : 0);
388511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (found);
389511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
390511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
391511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
392511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
393511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
394511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic BOOL PktSetAccess (void)
395511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
396511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0200 + pktInfo.class;
397511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = 0xFFFF;
398511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_dx = 0;
399511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_cx = 0;
400511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
401511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
402511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.ds  = 0;
403511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.esi = 0;
404511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.es  = RP_SEG (realBase);
405511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.edi = (WORD) &PktReceiver;
406511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
407511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
408511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.ds = 0;
409511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.si = 0;
410511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.es = rm_mem.rm_segment;
411511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.di = PktReceiver;
412511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
413511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
414511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ds = 0;
415511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_si = 0;
416511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = rm_base_seg;
417511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = PktReceiver;
418511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
419511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
420511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ds = 0;
421511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_si = 0;
422511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = FP_SEG (&PktReceiver);
423511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = FP_OFF (&PktReceiver);
424511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
425511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
426511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
427511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
428511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
429511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.handle = reg.r_ax;
430511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
431511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
432511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
433511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
434511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
435511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktReleaseHandle (WORD handle)
436511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
437511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0300;
438511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = handle;
439511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return PktInterrupt();
440511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
441511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
442511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
443511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
444511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktTransmit (const void *eth, int len)
445511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
446511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (len > ETH_MTU)
447511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
448511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
449511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0400;             /* Function 4, send pkt */
450511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_cx = len;                /* total size of frame  */
451511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
452511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & DJGPP)
453511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemput (eth, len, realBase+pktTxBuf);
454511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.ds = rm_mem.rm_segment;  /* DOS data segment and */
455511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.si = pktTxBuf;           /* DOS offset to buffer */
456511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
457511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
458511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy ((void*)(realBase+pktTxBuf), eth, len);
459511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ds = rm_base_seg;
460511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_si = pktTxBuf;
461511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
462511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & PHARLAP)
463511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&pktTxBuf, eth, len);
464511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ds = FP_SEG (&pktTxBuf);
465511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_si = FP_OFF (&pktTxBuf);
466511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
467511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
468511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ds = FP_SEG (eth);
469511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_si = FP_OFF (eth);
470511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
471511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
472511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return PktInterrupt();
473511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
474511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
475511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
476511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
477511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & (DJGPP|DOS4GW))
478511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL __inline BOOL CheckElement (RX_ELEMENT *rx)
479511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
480511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL __inline BOOL CheckElement (RX_ELEMENT _far *rx)
481511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
482511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
483511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  WORD count_1, count_2;
484511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
485511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /*
486511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * We got an upcall to the same RMCB with wrong handle.
487511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * This can happen if we failed to release handle at program exit
488511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
489511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (rx->handle != pktInfo.handle)
490511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
491511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktInfo.error = "Wrong handle";
492511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    intStat.wrongHandle++;
493511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktReleaseHandle (rx->handle);
494511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
495511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
496511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  count_1 = rx->firstCount;
497511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  count_2 = rx->secondCount;
498511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
499511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (count_1 != count_2)
500511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
501511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktInfo.error = "Bad sync";
502511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    intStat.badSync++;
503511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
504511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
505511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (count_1 > ETH_MAX)
506511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
507511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktInfo.error = "Large esize";
508511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    intStat.tooLarge++;
509511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
510511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
511511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if 0
512511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (count_1 < ETH_MIN)
513511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
514511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktInfo.error = "Small esize";
515511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    intStat.tooSmall++;
516511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
517511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
518511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
519511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
520511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
521511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
522511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
523511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
524511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktTerminHandle (WORD handle)
525511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
526511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0500;
527511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = handle;
528511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return PktInterrupt();
529511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
530511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
531511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
532511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
533511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktResetInterface (WORD handle)
534511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
535511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0700;
536511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = handle;
537511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return PktInterrupt();
538511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
539511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
540511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
541511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
542511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktSetReceiverMode (PKT_RX_MODE mode)
543511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
544511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pktInfo.class == PD_SLIP || pktInfo.class == PD_PPP)
545511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (TRUE);
546511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
547511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x1400;
548511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = pktInfo.handle;
549511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_cx = (WORD)mode;
550511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
551511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
552511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
553511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
554511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  receiveMode = mode;
555511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
556511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
557511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
558511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
559511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
560511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktGetReceiverMode (PKT_RX_MODE *mode)
561511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
562511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x1500;
563511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = pktInfo.handle;
564511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
565511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
566511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
567511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
568511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  *mode = reg.r_ax;
569511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
570511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
571511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
572511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
573511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
574511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic PKT_STAT initialStat;         /* statistics at startup */
575511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic BOOL     resetStat = FALSE;   /* statistics reset ? */
576511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
577511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktGetStatistics (WORD handle)
578511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
579511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x1800;
580511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = handle;
581511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
582511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
583511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
584511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
585511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
586511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ReadRealMem (&pktStat, DOS_ADDR(reg.ds,reg.esi), sizeof(pktStat));
587511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
588511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
589511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktStat), &pktStat);
590511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
591511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
592511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&pktStat, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktStat));
593511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
594511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
595511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _fmemcpy (&pktStat, MK_FP(reg.r_ds,reg.r_si), sizeof(pktStat));
596511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
597511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
598511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
599511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
600511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
601511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
602511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
603511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktSessStatistics (WORD handle)
604511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
605511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktGetStatistics(pktInfo.handle))
606511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
607511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
608511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (resetStat)
609511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
610511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.inPackets  -= initialStat.inPackets;
611511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.outPackets -= initialStat.outPackets;
612511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.inBytes    -= initialStat.inBytes;
613511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.outBytes   -= initialStat.outBytes;
614511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.inErrors   -= initialStat.inErrors;
615511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.outErrors  -= initialStat.outErrors;
616511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.outErrors  -= initialStat.outErrors;
617511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktStat.lost       -= initialStat.lost;
618511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
619511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
620511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
621511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
622511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
623511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
624511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktResetStatistics (WORD handle)
625511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
626511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktGetStatistics(pktInfo.handle))
627511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
628511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
629511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&initialStat, &pktStat, sizeof(initialStat));
630511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  resetStat = TRUE;
631511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
632511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
633511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
634511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
635511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
636511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktGetAddress (ETHER *addr)
637511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
638511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0600;
639511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = pktInfo.handle;
640511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_cx = sizeof (*addr);
641511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
642511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & DJGPP)
643511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.es = rm_mem.rm_segment;
644511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.di = pktTemp;
645511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
646511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = rm_base_seg;
647511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = pktTemp;
648511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
649511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = FP_SEG (&pktTemp);
650511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = FP_OFF (&pktTemp);  /* ES:DI = address for result */
651511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
652511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
653511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
654511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
655511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
656511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
657511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ReadRealMem (addr, realBase + (WORD)&pktTemp, sizeof(*addr));
658511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
659511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
660511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemget (realBase+pktTemp, sizeof(*addr), addr);
661511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
662511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
663511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (addr, (void*)(realBase+pktTemp), sizeof(*addr));
664511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
665511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
666511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy ((void*)addr, &pktTemp, sizeof(*addr));
667511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
668511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
669511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
670511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
671511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
672511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
673511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
674511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktSetAddress (const ETHER *addr)
675511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
676511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* copy addr to real-mode scrath area */
677511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
678511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
679511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  WriteRealMem (realBase + (WORD)&pktTemp, (void*)addr, sizeof(*addr));
680511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
681511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
682511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemput (addr, sizeof(*addr), realBase+pktTemp);
683511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
684511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
685511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy ((void*)(realBase+pktTemp), addr, sizeof(*addr));
686511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
687511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
688511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&pktTemp, (void*)addr, sizeof(*addr));
689511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
690511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
691511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x1900;
692511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_cx = sizeof (*addr);      /* address length       */
693511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
694511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & DJGPP)
695511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.es = rm_mem.rm_segment;   /* DOS offset to param  */
696511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.x.di = pktTemp;             /* DOS segment to param */
697511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
698511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = rm_base_seg;
699511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = pktTemp;
700511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
701511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_es = FP_SEG (&pktTemp);
702511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_di = FP_OFF (&pktTemp);
703511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
704511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
705511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return PktInterrupt();
706511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
707511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
708511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
709511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
710511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktGetDriverInfo (void)
711511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
712511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.majVer = 0;
713511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.minVer = 0;
714511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memset (&pktInfo.name, 0, sizeof(pktInfo.name));
715511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x01FF;
716511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_bx = 0;
717511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
718511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
719511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
720511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
721511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.number = reg.r_cx & 0xFF;
722511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.class  = reg.r_cx >> 8;
723511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if 0
724511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.minVer = reg.r_bx % 10;
725511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.majVer = reg.r_bx / 10;
726511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
727511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.majVer = reg.r_bx;  // !!
728511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
729511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.funcs  = reg.r_ax & 0xFF;
730511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.type   = reg.r_dx & 0xFF;
731511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
732511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
733511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ReadRealMem (&pktInfo.name, DOS_ADDR(reg.ds,reg.esi), sizeof(pktInfo.name));
734511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
735511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
736511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktInfo.name), &pktInfo.name);
737511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
738511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
739511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&pktInfo.name, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktInfo.name));
740511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
741511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
742511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _fmemcpy (&pktInfo.name, MK_FP(reg.r_ds,reg.r_si), sizeof(pktInfo.name));
743511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
744511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
745511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
746511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
747511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
748511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
749511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktGetDriverParam (void)
750511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
751511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  reg.r_ax = 0x0A00;
752511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
753511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktInterrupt())
754511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
755511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
756511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
757511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ReadRealMem (&pktInfo.majVer, DOS_ADDR(reg.es,reg.edi), PKT_PARAM_SIZE);
758511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
759511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
760511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemget (DOS_ADDR(reg.x.es,reg.x.di), PKT_PARAM_SIZE, &pktInfo.majVer);
761511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
762511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
763511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy (&pktInfo.majVer, (void*)DOS_ADDR(reg.r_es,reg.r_di), PKT_PARAM_SIZE);
764511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
765511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
766511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _fmemcpy (&pktInfo.majVer, MK_FP(reg.r_es,reg.r_di), PKT_PARAM_SIZE);
767511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
768511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
769511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
770511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
771511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
772511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
773511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
774511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC int PktReceive (BYTE *buf, int max)
775511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
776511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD inOfs  = *rxInOfsFp;
777511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD outOfs = *rxOutOfsFp;
778511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
779511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (outOfs != inOfs)
780511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
781511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      RX_ELEMENT _far *head = (RX_ELEMENT _far*)(protBase+outOfs);
782511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      int size, len = max;
783511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
784511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (CheckElement(head))
785511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      {
786511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = min (head->firstCount, sizeof(RX_ELEMENT));
787511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        len  = min (size, max);
788511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        _fmemcpy (buf, &head->destin, len);
789511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      }
790511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else
791511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = -1;
792511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
793511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      outOfs += sizeof (RX_ELEMENT);
794511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (outOfs > LAST_RX_BUF)
795511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          outOfs = FIRST_RX_BUF;
796511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      *rxOutOfsFp = outOfs;
797511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (size);
798511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
799511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (0);
800511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
801511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
802511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC void PktQueueBusy (BOOL busy)
803511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
804511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    *rxOutOfsFp = busy ? (*rxInOfsFp + sizeof(RX_ELEMENT)) : *rxInOfsFp;
805511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (*rxOutOfsFp > LAST_RX_BUF)
806511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        *rxOutOfsFp = FIRST_RX_BUF;
807511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    *(DWORD _far*)(protBase + (WORD)&pktDrop) = 0;
808511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
809511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
810511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC WORD PktBuffersUsed (void)
811511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
812511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD inOfs  = *rxInOfsFp;
813511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD outOfs = *rxOutOfsFp;
814511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
815511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (inOfs >= outOfs)
816511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return (inOfs - outOfs) / sizeof(RX_ELEMENT);
817511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
818511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
819511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
820511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC DWORD PktRxDropped (void)
821511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
822511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (*(DWORD _far*)(protBase + (WORD)&pktDrop));
823511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
824511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
825511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
826511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC int PktReceive (BYTE *buf, int max)
827511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
828511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD ofs = _farpeekw (_dos_ds, realBase+rxOutOfs);
829511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
830511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (ofs != _farpeekw (_dos_ds, realBase+rxInOfs))
831511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
832511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      RX_ELEMENT head;
833511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      int  size, len = max;
834511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
835511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.firstCount  = _farpeekw (_dos_ds, realBase+ofs);
836511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.secondCount = _farpeekw (_dos_ds, realBase+ofs+2);
837511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.handle      = _farpeekw (_dos_ds, realBase+ofs+4);
838511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
839511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (CheckElement(&head))
840511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      {
841511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = min (head.firstCount, sizeof(RX_ELEMENT));
842511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        len  = min (size, max);
843511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        dosmemget (realBase+ofs+6, len, buf);
844511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      }
845511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else
846511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = -1;
847511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
848511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      ofs += sizeof (RX_ELEMENT);
849511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (ofs > LAST_RX_BUF)
850511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall           _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
851511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);
852511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (size);
853511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
854511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (0);
855511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
856511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
857511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC void PktQueueBusy (BOOL busy)
858511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
859511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD ofs;
860511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
861511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    disable();
862511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ofs = _farpeekw (_dos_ds, realBase+rxInOfs);
863511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (busy)
864511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ofs += sizeof (RX_ELEMENT);
865511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
866511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (ofs > LAST_RX_BUF)
867511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
868511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);
869511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _farpokel (_dos_ds, realBase+pktDrop, 0UL);
870511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    enable();
871511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
872511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
873511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC WORD PktBuffersUsed (void)
874511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
875511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD inOfs, outOfs;
876511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
877511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    disable();
878511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    inOfs  = _farpeekw (_dos_ds, realBase+rxInOfs);
879511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    outOfs = _farpeekw (_dos_ds, realBase+rxOutOfs);
880511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    enable();
881511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (inOfs >= outOfs)
882511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return (inOfs - outOfs) / sizeof(RX_ELEMENT);
883511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
884511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
885511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
886511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC DWORD PktRxDropped (void)
887511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
888511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return _farpeekl (_dos_ds, realBase+pktDrop);
889511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
890511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
891511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
892511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC int PktReceive (BYTE *buf, int max)
893511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
894511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD ofs = *(WORD*) (realBase+rxOutOfs);
895511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
896511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (ofs != *(WORD*) (realBase+rxInOfs))
897511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
898511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      RX_ELEMENT head;
899511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      int  size, len = max;
900511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
901511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.firstCount  = *(WORD*) (realBase+ofs);
902511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.secondCount = *(WORD*) (realBase+ofs+2);
903511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      head.handle      = *(WORD*) (realBase+ofs+4);
904511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
905511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (CheckElement(&head))
906511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      {
907511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = min (head.firstCount, sizeof(RX_ELEMENT));
908511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        len  = min (size, max);
909511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        memcpy (buf, (const void*)(realBase+ofs+6), len);
910511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      }
911511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else
912511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = -1;
913511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
914511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      ofs += sizeof (RX_ELEMENT);
915511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (ofs > LAST_RX_BUF)
916511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall           *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
917511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else *(WORD*) (realBase+rxOutOfs) = ofs;
918511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (size);
919511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
920511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (0);
921511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
922511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
923511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC void PktQueueBusy (BOOL busy)
924511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
925511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD ofs;
926511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
927511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _disable();
928511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ofs = *(WORD*) (realBase+rxInOfs);
929511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (busy)
930511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ofs += sizeof (RX_ELEMENT);
931511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
932511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (ofs > LAST_RX_BUF)
933511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
934511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    else *(WORD*) (realBase+rxOutOfs) = ofs;
935511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    *(DWORD*) (realBase+pktDrop) = 0UL;
936511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _enable();
937511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
938511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
939511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC WORD PktBuffersUsed (void)
940511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
941511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD inOfs, outOfs;
942511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
943511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _disable();
944511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    inOfs  = *(WORD*) (realBase+rxInOfs);
945511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    outOfs = *(WORD*) (realBase+rxOutOfs);
946511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _enable();
947511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (inOfs >= outOfs)
948511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return (inOfs - outOfs) / sizeof(RX_ELEMENT);
949511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
950511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
951511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
952511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC DWORD PktRxDropped (void)
953511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
954511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return *(DWORD*) (realBase+pktDrop);
955511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
956511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
957511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else     /* real-mode small/large model */
958511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
959511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC int PktReceive (BYTE *buf, int max)
960511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
961511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (rxOutOfs != rxInOfs)
962511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
963511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      RX_ELEMENT far *head = (RX_ELEMENT far*) MK_FP (_DS,rxOutOfs);
964511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      int  size, len = max;
965511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
966511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (CheckElement(head))
967511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      {
968511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = min (head->firstCount, sizeof(RX_ELEMENT));
969511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        len  = min (size, max);
970511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        _fmemcpy (buf, &head->destin, len);
971511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      }
972511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      else
973511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        size = -1;
974511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
975511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      rxOutOfs += sizeof (RX_ELEMENT);
976511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (rxOutOfs > LAST_RX_BUF)
977511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          rxOutOfs = FIRST_RX_BUF;
978511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (size);
979511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
980511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (0);
981511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
982511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
983511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC void PktQueueBusy (BOOL busy)
984511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
985511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rxOutOfs = busy ? (rxInOfs + sizeof(RX_ELEMENT)) : rxInOfs;
986511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (rxOutOfs > LAST_RX_BUF)
987511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        rxOutOfs = FIRST_RX_BUF;
988511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktDrop = 0L;
989511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
990511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
991511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC WORD PktBuffersUsed (void)
992511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
993511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD inOfs  = rxInOfs;
994511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    WORD outOfs = rxOutOfs;
995511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
996511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (inOfs >= outOfs)
997511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return ((inOfs - outOfs) / sizeof(RX_ELEMENT));
998511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));
999511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1000511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1001511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PUBLIC DWORD PktRxDropped (void)
1002511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1003511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (pktDrop);
1004511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1005511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1006511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1007511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
1008511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1009511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL __inline void PktFreeMem (void)
1010511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1011511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
1012511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (realSeg)
1013511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1014511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _dx_real_free (realSeg);
1015511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    realSeg = 0;
1016511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1017511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DJGPP)
1018511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (rm_mem.rm_segment)
1019511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1020511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    unsigned ofs;  /* clear the DOS-mem to prevent further upcalls */
1021511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1022511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    for (ofs = 0; ofs < 16 * rm_mem.size / 4; ofs += 4)
1023511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       _farpokel (_dos_ds, realBase + ofs, 0);
1024511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    _go32_dpmi_free_dos_memory (&rm_mem);
1025511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rm_mem.rm_segment = 0;
1026511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1027511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
1028511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (rm_base_sel)
1029511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1030511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    dpmi_real_free (rm_base_sel);
1031511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rm_base_sel = 0;
1032511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1033511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1034511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1035511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1036511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/**************************************************************************/
1037511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1038511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktExitDriver (void)
1039511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1040511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pktInfo.handle)
1041511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1042511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (!PktSetReceiverMode(PDRX_BROADCAST))
1043511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       PUTS ("Error restoring receiver mode.");
1044511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1045511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (!PktReleaseHandle(pktInfo.handle))
1046511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       PUTS ("Error releasing PKT-DRVR handle.");
1047511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1048511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1049511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    pktInfo.handle = 0;
1050511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1051511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1052511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pcap_pkt_debug >= 1)
1053511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     printf ("Internal stats: too-small %lu, too-large %lu, bad-sync %lu, "
1054511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "wrong-handle %lu\n",
1055511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             intStat.tooSmall, intStat.tooLarge,
1056511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             intStat.badSync, intStat.wrongHandle);
1057511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
1058511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1059511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1060511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & (DJGPP|DOS4GW))
1061511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic void dump_pkt_stub (void)
1062511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1063511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  int i;
1064511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1065511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  fprintf (stderr, "PktReceiver %lu, pkt_stub[PktReceiver] =\n",
1066511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall           PktReceiver);
1067511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  for (i = 0; i < 15; i++)
1068511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      fprintf (stderr, "%02X, ", real_stub_array[i+PktReceiver]);
1069511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  fputs ("\n", stderr);
1070511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1071511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1072511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1073511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
1074511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Front end initialization routine
1075511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
1076511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC BOOL PktInitDriver (PKT_RX_MODE mode)
1077511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1078511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PKT_RX_MODE rxMode;
1079511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  BOOL   writeInfo = (pcap_pkt_debug >= 3);
1080511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1081511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pktInfo.quiet = (pcap_pkt_debug < 3);
1082511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1083511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP) && defined(__HIGHC__)
1084511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (_mwenv != 2)
1085511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1086511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf (stderr, "Only Pharlap DOS extender supported.\n");
1087511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1088511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1089511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1090511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1091511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP) && defined(__WATCOMC__)
1092511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (_Extender != 1)
1093511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1094511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf (stderr, "Only DOS4GW style extenders supported.\n");
1095511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1096511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1097511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1098511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1099511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktSearchDriver())
1100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Packet driver not found.");
1102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktGetDriverInfo())
1107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Error getting pkt-drvr information.");
1109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & PHARLAP)
1114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (RealCopy((ULONG)&rxOutOfs, (ULONG)&pktRxEnd,
1115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               &realBase, &protBase, (USHORT*)&realSeg))
1116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rxOutOfsFp  = (WORD _far *) (protBase + (WORD) &rxOutOfs);
1118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    rxInOfsFp   = (WORD _far *) (protBase + (WORD) &rxInOfs);
1119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    *rxOutOfsFp = FIRST_RX_BUF;
1120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    *rxInOfsFp  = FIRST_RX_BUF;
1121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  else
1123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Cannot allocate real-mode stub.");
1125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1127511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1128511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & (DJGPP|DOS4GW))
1129511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (sizeof(real_stub_array) > 0xFFFF)
1130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1131511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf (stderr, "`real_stub_array[]' too big.\n");
1132511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1133511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1134511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & DJGPP)
1135511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  rm_mem.size = (sizeof(real_stub_array) + 15) / 16;
1136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1137511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (_go32_dpmi_allocate_dos_memory(&rm_mem) || rm_mem.rm_offset != 0)
1138511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1139511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("real-mode init failed.");
1140511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1141511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  realBase = (rm_mem.rm_segment << 4);
1143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  dosmemput (&real_stub_array, sizeof(real_stub_array), realBase);
1144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _farpokel (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);
1145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _farpokel (_dos_ds, realBase+rxInOfs,  FIRST_RX_BUF);
1146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif (DOSX & DOS4GW)
1148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  rm_base_seg = dpmi_real_malloc (sizeof(real_stub_array), &rm_base_sel);
1149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!rm_base_seg)
1150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("real-mode init failed.");
1152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  realBase = (rm_base_seg << 4);
1155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memcpy ((void*)realBase, &real_stub_array, sizeof(real_stub_array));
1156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;
1157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  *(WORD*) (realBase+rxInOfs)  = FIRST_RX_BUF;
1158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    int pushf = PktReceiver;
1162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    while (real_stub_array[pushf++] != 0x9C &&    /* pushf */
1164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall           real_stub_array[pushf]   != 0xFA)      /* cli   */
1165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
1166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (++para_skip > 16)
1167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      {
1168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        fprintf (stderr, "Something wrong with `pkt_stub.inc'.\n");
1169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        para_skip = 0;
1170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        dump_pkt_stub();
1171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        return (FALSE);
1172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      }
1173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
1174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (*(WORD*)(real_stub_array + offsetof(PktRealStub,_dummy)) != 0xB800)
1175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
1176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      fprintf (stderr, "`real_stub_array[]' is misaligned.\n");
1177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (FALSE);
1178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
1179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pcap_pkt_debug > 2)
1182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      dump_pkt_stub();
1183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else
1185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  rxOutOfs = FIRST_RX_BUF;
1186511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  rxInOfs  = FIRST_RX_BUF;
1187511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1188511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1189511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktSetAccess())
1190511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1191511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Error setting pkt-drvr access.");
1192511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1193511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1194511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1195511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1196511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktGetAddress(&myAddress))
1197511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1198511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Error fetching adapter address.");
1199511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1200511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1201511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1202511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1203511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktSetReceiverMode(mode))
1204511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1205511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Error setting receiver mode.");
1206511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1207511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1208511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1209511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1210511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (!PktGetReceiverMode(&rxMode))
1211511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1212511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PUTS ("Error getting receiver mode.");
1213511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktFreeMem();
1214511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    return (FALSE);
1215511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1216511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1217511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (writeInfo)
1218511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     printf ("Pkt-driver information:\n"
1219511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Version  : %d.%d\n"
1220511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Name     : %.15s\n"
1221511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Class    : %u (%s)\n"
1222511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Type     : %u\n"
1223511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Number   : %u\n"
1224511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Funcs    : %u\n"
1225511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Intr     : %Xh\n"
1226511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Handle   : %u\n"
1227511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Extended : %s\n"
1228511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Hi-perf  : %s\n"
1229511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  RX mode  : %s\n"
1230511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             "  Eth-addr : %02X:%02X:%02X:%02X:%02X:%02X\n",
1231511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1232511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.majVer, pktInfo.minVer, pktInfo.name,
1233511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.class,  PktGetClassName(pktInfo.class),
1234511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.type,   pktInfo.number,
1235511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.funcs,  pktInfo.intr,   pktInfo.handle,
1236511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.funcs == 2 || pktInfo.funcs == 6 ? "Yes" : "No",
1237511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             pktInfo.funcs == 5 || pktInfo.funcs == 6 ? "Yes" : "No",
1238511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             PktRXmodeStr(rxMode),
1239511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             myAddress[0], myAddress[1], myAddress[2],
1240511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall             myAddress[3], myAddress[4], myAddress[5]);
1241511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1242511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(DEBUG) && (DOSX & PHARLAP)
1243511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (writeInfo)
1244511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1245511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    DWORD    rAdr = realBase + (WORD)&PktReceiver;
1246511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    unsigned sel, ofs;
1247511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1248511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("\nReceiver at   %04X:%04X\n", RP_SEG(rAdr),    RP_OFF(rAdr));
1249511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("Realbase    = %04X:%04X\n",   RP_SEG(realBase),RP_OFF(realBase));
1250511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1251511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    sel = _FP_SEG (protBase);
1252511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ofs = _FP_OFF (protBase);
1253511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("Protbase    = %04X:%08X\n", sel,ofs);
1254511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("RealSeg     = %04X\n", realSeg);
1255511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1256511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    sel = _FP_SEG (rxOutOfsFp);
1257511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ofs = _FP_OFF (rxOutOfsFp);
1258511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("rxOutOfsFp  = %04X:%08X\n", sel,ofs);
1259511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1260511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    sel = _FP_SEG (rxInOfsFp);
1261511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ofs = _FP_OFF (rxInOfsFp);
1262511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("rxInOfsFp   = %04X:%08X\n", sel,ofs);
1263511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1264511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("Ready: *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",
1265511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            *rxOutOfsFp, *rxInOfsFp);
1266511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1267511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    PktQueueBusy (TRUE);
1268511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf ("Busy:  *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",
1269511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            *rxOutOfsFp, *rxInOfsFp);
1270511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1271511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1272511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1273511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  memset (&pktStat, 0, sizeof(pktStat));  /* clear statistics */
1274511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  PktQueueBusy (TRUE);
1275511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
1276511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1277511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1278511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1279511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
1280511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * DPMI functions only for Watcom + DOS4GW extenders
1281511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
1282511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if (DOSX & DOS4GW)
1283511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL DWORD dpmi_get_real_vector (int intr)
1284511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1285511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  union REGS r;
1286511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1287511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.eax = 0x200;
1288511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.ebx = (DWORD) intr;
1289511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  int386 (0x31, &r, &r);
1290511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return ((r.w.cx << 4) + r.w.dx);
1291511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1292511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1293511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL WORD dpmi_real_malloc (int size, WORD *selector)
1294511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1295511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  union REGS r;
1296511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1297511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.eax = 0x0100;             /* DPMI allocate DOS memory */
1298511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.ebx = (size + 15) / 16;   /* Number of paragraphs requested */
1299511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  int386 (0x31, &r, &r);
1300511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (r.w.cflag & 1)
1301511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (0);
1302511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1303511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  *selector = r.w.dx;
1304511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (r.w.ax);              /* Return segment address */
1305511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1306511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1307511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallLOCAL void dpmi_real_free (WORD selector)
1308511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1309511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  union REGS r;
1310511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1311511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.eax = 0x101;              /* DPMI free DOS memory */
1312511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  r.x.ebx = selector;           /* Selector to free */
1313511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  int386 (0x31, &r, &r);
1314511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1315511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
1316511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1318511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(DOSX) && (DOSX & PHARLAP)
1319511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
1320511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Description:
1321511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     This routine allocates conventional memory for the specified block
1322511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     of code (which must be within the first 64K of the protected mode
1323511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     program segment) and copies the code to it.
1324511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
1325511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     The caller should free up the conventional memory block when it
1326511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     is done with the conventional memory.
1327511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
1328511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     NOTE THIS ROUTINE REQUIRES 386|DOS-EXTENDER 3.0 OR LATER.
1329511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
1330511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Calling arguments:
1331511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     start_offs      start of real mode code in program segment
1332511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     end_offs        1 byte past end of real mode code in program segment
1333511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     real_basep      returned;  real mode ptr to use as a base for the
1334511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        real mode code (eg, to get the real mode FAR
1335511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        addr of a function foo(), take
1336511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        real_basep + (ULONG) foo).
1337511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        This pointer is constructed such that
1338511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        offsets within the real mode segment are
1339511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        the same as the link-time offsets in the
1340511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        protected mode program segment
1341511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     prot_basep      returned;  prot mode ptr to use as a base for getting
1342511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        to the conventional memory, also constructed
1343511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        so that adding the prot mode offset of a
1344511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        function or variable to the base gets you a
1345511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        ptr to the function or variable in the
1346511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        conventional memory block.
1347511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     rmem_adrp       returned;  real mode para addr of allocated
1348511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        conventional memory block, to be used to free
1349511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        up the conventional memory when done.  DO NOT
1350511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        USE THIS TO CONSTRUCT A REAL MODE PTR, USE
1351511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        REAL_BASEP INSTEAD SO THAT OFFSETS WORK OUT
1352511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *                        CORRECTLY.
1353511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
1354511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Returned values:
1355511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     0      if error
1356511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *     1      if success
1357511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
1358511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint RealCopy (ULONG    start_offs,
1359511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              ULONG    end_offs,
1360511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              REALPTR *real_basep,
1361511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              FARPTR  *prot_basep,
1362511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              USHORT  *rmem_adrp)
1363511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
1364511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ULONG   rm_base;    /* base real mode para addr for accessing */
1365511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall                      /* allocated conventional memory          */
1366511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  UCHAR  *source;     /* source pointer for copy                */
1367511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  FARPTR  destin;     /* destination pointer for copy           */
1368511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ULONG   len;        /* number of bytes to copy                */
1369511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ULONG   temp;
1370511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  USHORT  stemp;
1371511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1372511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* First check for valid inputs
1373511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
1374511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (start_offs >= end_offs || end_offs > 0x10000)
1375511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall     return (FALSE);
1376511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1377511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* Round start_offs down to a paragraph (16-byte) boundary so we can set up
1378511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * the real mode pointer easily. Round up end_offs to make sure we allocate
1379511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * enough paragraphs
1380511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
1381511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  start_offs &= ~15;
1382511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  end_offs = (15 + (end_offs << 4)) >> 4;
1383511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1384511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* Allocate the conventional memory for our real mode code.  Remember to
1385511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * round byte count UP to 16-byte paragraph size.  We alloc it
1386511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * above the DOS data buffer so both the DOS data buffer and the appl
1387511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * conventional mem block can still be resized.
1388511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   *
1389511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * First just try to alloc it;  if we can't get it, shrink the appl mem
1390511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * block down to the minimum, try to alloc the memory again, then grow the
1391511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * appl mem block back to the maximum.  (Don't try to shrink the DOS data
1392511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * buffer to free conventional memory;  it wouldn't be good for this routine
1393511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * to have the possible side effect of making file I/O run slower.)
1394511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
1395511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  len = ((end_offs - start_offs) + 15) >> 4;
1396511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)
1397511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
1398511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (_dx_cmem_usage(0, 0, &temp, &temp) != _DOSE_NONE)
1399511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return (FALSE);
1400511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1401511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)
1402511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       *rmem_adrp = 0;
1403511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1404511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (_dx_cmem_usage(0, 1, &temp, &temp) != _DOSE_NONE)
1405511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
1406511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      if (*rmem_adrp != 0)
1407511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         _dx_real_free (*rmem_adrp);
1408511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      return (FALSE);
1409511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
1410511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1411511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    if (*rmem_adrp == 0)
1412511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       return (FALSE);
1413511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
1414511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1415511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* Construct real mode & protected mode pointers to access the allocated
1416511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * memory.  Note we know start_offs is aligned on a paragraph (16-byte)
1417511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * boundary, because we rounded it down.
1418511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   *
1419511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * We make the offsets come out rights by backing off the real mode selector
1420511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   * by start_offs.
1421511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
1422511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  rm_base = ((ULONG) *rmem_adrp) - (start_offs >> 4);
1423511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  RP_SET (*real_basep, 0, rm_base);
1424511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  FP_SET (*prot_basep, rm_base << 4, SS_DOSMEM);
1425511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1426511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  /* Copy the real mode code/data to the allocated memory
1427511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   */
1428511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  source = (UCHAR *) start_offs;
1429511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  destin = *prot_basep;
1430511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  FP_SET (destin, FP_OFF(*prot_basep) + start_offs, FP_SEL(*prot_basep));
1431511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  len = end_offs - start_offs;
1432511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  WriteFarMem (destin, source, len);
1433511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
1434511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  return (TRUE);
1435511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
1436511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* DOSX && (DOSX & PHARLAP) */
1437