/* enetdefs.h Stanford 25 April 1983 */
* - check maxwaiting, etc.
* - Xdrops in enState may be meaningless
* Ethernet definitions NOT needed for user processes
**********************************************************************
* 7 October 1985 Jeff Mogul Stanford
* Removed ENMAXOPENS limitation; available minors are now
* dynamically allocated to interfaces.
* Certain arrays in the enState structure are now indirected
* 17 October 1984 Jeff Mogul Stanford
* Added RecvCount filed to enOpenDescriptor struct to store count
* of packets received on this filter.
* Also, made some changes to encourage use of "high-priority"
* - changed ENHIPRIDEV from 12 to 0; allows anyone to use
* - changed ENHIPRI from 128 to 2; no point in having more than
* one priority below ENHIPRI, since all would be equivalent.
* 2 October 1984 Jeff Mogul Stanford
* Added field to enOpenDescriptor struct to store pre-computed
* address of short word AFTER last valid word in the filter;
* this saves a few instructions in some very busy code.
* 10 November 1983 Jeffrey Mogul Stanford
* Minor changes to support EIOCDEVP ioctl,
* removed references to enUnit[]
* 25-Apr-83 Jeffrey Mogul Stanford
* Began conversion to 4.2BSD. This involves removing all
* references to the actual hardware.
* Most previous history comments removed.
* Split off from definitions of interest to users.
* 10-Aug-82 Mike Accetta (mja) at Carnegie-Mellon University
* Added EIOCMBIS and EIOCMBIC definitions, and new ENHOLDSIG mode
* bit and ENPRIVMODES defintions (V3.05e). [Last change before
* 4.2BSD conversion starts.]
* 22-Feb-80 Rick Rashid (rfr) at Carnegie-Mellon University
* Rewritten for multiple simultaneous opens with filters (V1.05).
* 18-Jan-80 Mike Accetta (mja) at Carnegie-Mellon University
**********************************************************************
#define ENHIPRI 2 /* high priority priority */
* setting ENHIPRI to 2 makes sense because all
* priorities below ENHIPRI are equivalent; therefore,
* we only need one of them.
#define ENMAXPRI 255 /* maximum high priority priority */
#define ENUNIT(dev) (enUnitMap[minor(dev)]) /* macro */
/* to extract ethernet unit number */
/* from device number (used as the */
/* index into the enState[] table); */
#define ENINDEX(dev) (minor(dev)) /* macro to extract logical */
/* device index from device number */
/* (used as the index into the */
/* AllDescriptors table for the */
#define ENMAXWAITING 8 /* maximum number of packets */
/* which can be queued at one time */
/* for an open enet file (max 256) */
#define ENDEFWAITING 2 /* default number of packets */
/* which can be queued at one */
/* time for an open enet file */
#define ENPACKETS 50 /* number of preallocated packets */
/* available for receiving (these
/* should be allocated dynamically */
/* once the system makes */
/* this more feasible) */
#define ENMINSCAVENGE 4 /* minimum number of packets */
/* guaranteed to be freed by */
#define ENKERNEL (0x8000) /* flag bit to indicate kernel mode */
* The following definitions are meant to clean up
* C language syntax a bit.
typedef enum {false, true} boolean
;
#define FALSE ((int)false)
* General purpose structure to define circular queues.
* Both the queue header and the queue elements have this
/* Temporary used by queue macros. */
#define enqueue(head,elt) \
{ (elt)->F = (head);(elt)->B = (head)->B;(head)->B = (elt);((elt)->B)->F = (elt); };
#define remqueue(head,elt) \
{ ((elt)->B)->F = (elt)->F; ((elt)->F)->B = (elt)->B; };
(((q_tmp = (head)->F) == (head)) ? NULL : \
(((q_tmp->B)->F = q_tmp->F), \
((q_tmp->F)->B = q_tmp->B), \
#define queueempty(head) \
#define initqueue(head) \
{ (head)->F = (head); (head)->B = (head); };
* The ethernet packet structure.
struct Queue enP_Link
; /* queue pointers */
u_short
*enP_Data
; /* pointer to start of packet */
short enP_ByteCount
; /* # of bytes in Data */
u_short enP_RefCount
; /* # of outstanding references to */
struct mbuf
*enP_mbuf
; /* first mbuf of packet */
struct Queue enQ_Head
; /* queue header and trailer pointers */
short enQ_NumQueued
; /* number of elements in queue */
struct enPacket
*enWQ_Packets
[ENMAXWAITING
];/* pointers to queued packets */
char enWQ_Head
; /* index into Packets (for dequeue) */
char enWQ_Tail
; /* index into Packets (for enqueue) */
u_char enWQ_NumQueued
; /* current queue size */
u_char enWQ_MaxWaiting
; /* threshold for additions */
#define enNextWaitQueueIndex(idx) \
if (++(idx) >= ENMAXWAITING) (idx) = 0
#define enPrevWaitQueueIndex(idx) \
if (--(idx) < 0) (idx) = (ENMAXWAITING-1)
* States of receive side of open enet file.
enum enStates
{ENRECVIDLE
, ENRECVTIMING
, ENRECVTIMEDOUT
};
struct Queue enOD_Link
; /* Linked list of OpenDescriptors */
struct enWaitQueue enOD_Waiting
; /* fixed Queue of waiting packets */
struct proc
*enOD_SigProc
; /* Process to signal (user mode) */
short enOD_SigPid
; /* Process ID of process to signal */
short enOD_SigNumb
; /* Signal number for input packet */
long enOD_Timeout
; /* Length of time to wait for packet */
struct enfilter enOD_OpenFilter
; /* Packet filter */
enum enStates enOD_RecvState
; /* see enStates enumeration (above) */
short enOD_Flag
; /* option bits */
/* following are for enetselect() */
short enOD_SelColl
; /* true if selects collide */
struct proc
*enOD_SelProc
; /* process that last selected us */
unsigned long enOD_RecvCount
; /* number of packets received */
/* store precomputed address of end of filter */
unsigned short *enOD_FiltEnd
; /* addr of short AFTER end of filt */
* State descriptor for each enet device
long ens_Rcnt
; /* input packets queued since */
long ens_Xcnt
; /* output packets sent since */
long ens_Rdrops
; /* input packets dropped since */
long ens_Xdrops
; /* output packets dropped since */
struct enQueue
/* queue of active open */
ens_Desq
; /* file descriptors */
struct endevp ens_DevParams
; /* device parameters, see enet.h */
#define enRcnt (enStatep->ens_Rcnt)
#define enXcnt (enStatep->ens_Xcnt)
#define enRdrops (enStatep->ens_Rdrops)
#define enXdrops (enStatep->ens_Xdrops)
#define enDesq (enStatep->ens_Desq)
#define enCurOpens (enStatep->ens_Desq.enQ_NumQueued)
#define enDevParams (enStatep->ens_DevParams)