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, ®); 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, ®); 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 (®); 329511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall r.x.edi = FP_OFF (®); 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*)®); 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