/* Include file for snoop.c */

/* info.drvr_functionality bit field */
#define EXTENDED	0x2
#define HIGH_PERF	0x4

/* recv_mode types */
#define	RCVR_OFF						1
#define RCVR_THIS_IF_ONLY		2
#define RCVR_BROADCAST 			3
#define RCVR_LIMITED_MULTI	4
#define RCVR_ALL_MULTI			5
#define RCVR_PERMISCUOUS		6

#define	ETHER_NS_IDP				0x0600             //   Xerox NS IDP
#define	ETHER_IP						0x0800             //   IP
#define	ETHER_X75						0x0801	           //   X.75 internet
#define	ETHER_NBS						0x0802	           //   NBS internet
#define	ETHER_ECMA					0x0803	           //   ECMA internet
#define	ETHER_CHAOS					0x0804	           //   ChaosNet
#define	ETHER_X25						0x0805	           //   X.25, level 3
#define	ETHER_ARP						0x0806	           //   ARP
#define	ETHER_XNS						0x0807	           //   XNS compatibility
#define	ETHER_DEC						0x6003             //   DECnet, phase IV
#define	ETHER_VLN						0x8003             //   Cronus VLN
#define	ETHER_HP						0x8005             //   HP Probe
#define	ETHER_NESTAR				0x8006             //   Nestar
#define	ETHER_EXCELAN				0x8010             //   Excelan
#define	ETHER_RARP					0x8035	           //   reverse ARP
#define	ETHER_LAN						0x8038             //   DEC LANbridge
#define	ETHER_APPLE					0x809b             //   Appletalk
#define	ETHER_LOOP					0x9000             //   loopback

#define ETHER_BUFSIZ				1536							 // size of ether buffer
#define	ETHER_ADDR_LEN			6                  // size of an address
																							 // type field codes

#define ADDR_TABLE_LEN 			256								 // arbitrary ether tbl len

#ifndef  SNOOP_MAIN
	extern char **src_tbl; 											 // src ether address
	extern char **dst_tbl; 											 // dest ether address
	extern int src_index;											 // pointers to first unused
	extern int dst_index;											 //  entry in the table

	extern volatile unsigned long int  discarded_pkts;
	extern unsigned long int  	 			 received_pkts;
	extern unsigned long int					 filtered_out_pkts;
#endif

typedef struct
{
	unsigned char dst[ETHER_ADDR_LEN];
	unsigned char src[ETHER_ADDR_LEN];
	unsigned int	type;
} ETHER_HEADER;


/* linked list buffer structure */

#define N_BUFS	8

typedef struct PKTBUF_STRUCT {
	volatile unsigned int     pktsize_flag;
	char far                 *buffer;
	struct PKTBUF_STRUCT far *next;
} PKTBUF;


/* drvr_info structure expected as returned from DRVRINFO */
typedef struct {
	char			drvr_functionality;
	int	  		drvr_version;
	char     	drvr_class;
	char      drvr_number;
	int	      drvr_type;
	char far *drvr_name;
} DRVR_INFO;

/* access_type structure expected as retured from ACCTYPE */
typedef struct {
	char	 	 	if_class;
	int	  		if_type;
	char	  	if_number;
	char far *type;
	int  	  	typelen;
	int	(far *receiver_ptr)();
} ACCESS_TYPE;


int pkt_find(void);     			/* Find packet driver interrupt */

int drvrinfo(int, DRVR_INFO far *);	/* ARG1: interrupt vector
						 ARG2: pointer to driver_info */

int acctype(int, ACCESS_TYPE far *);	/* ARG1: interrupt vector
						 ARG2: pointer to access_type */

far receiver(void);

int reltype(int, int);

void set_recv(int, int, int);

void dumpheader(ETHER_HEADER far *MAC_header, unsigned int length);

int hex2dec(char value);

void clear_table();

void build_buffers(PKTBUF far **head_buffer);

int get_drvrinfo(FILE *output, int pktdrvint, DRVR_INFO far *info);

int access_type_all(int pktdrvint, DRVR_INFO far *info,
										ACCESS_TYPE far *access);

void type_swap(ETHER_HEADER far *buf);

void display_stats(FILE *output);

int eth_filterdst(ETHER_HEADER far *buf);

int eth_filtersrc(ETHER_HEADER far *buf);


