/* snoop.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define  SNOOP_MAIN
#include "snoop.h"

volatile PKTBUF far        *receive_buffer;
volatile char               receiver_busy  = 0;
volatile unsigned long int  discarded_pkts = 0;

unsigned long int			      received_pkts = 0;
unsigned long int						filtered_out_pkts = 0;

char								 **src_tbl;
char 								 **dst_tbl;
int 									 src_index=0;
int 									 dst_index=0;


int main(int argc, char *argv[])
{
	int       	 pktdrvint;
	int		       i;
	int		       return_code = 0;
	int		       handle;
	DRVR_INFO 	 info;
	ACCESS_TYPE  access;
	PKTBUF far	*current_buffer;
	PKTBUF far  *first_buffer;


	clear_table();														// clear out source and dest

	if(!parse_options(argc-1,&argv[1])) {

		build_buffers(&first_buffer);         	// building link list of N_BUFS

		receive_buffer = current_buffer = first_buffer;
																						// set up receiver to point to
																						// buffer to display next

		pktdrvint = pkt_find();       					// find packet driver interrupt

		if(pktdrvint) {
			fprintf(stdout,"Found packet driver at 0x%x.\n",(int)pktdrvint);

			if(get_drvrinfo(stdout, pktdrvint, (DRVR_INFO far *)(&info))) {

				handle = access_type_all(pktdrvint, (DRVR_INFO far *)(&info),
																(ACCESS_TYPE far *)(&access));
				if(handle >= 0) {
					fprintf(stdout,"Receiver handle %d\n", handle);
					set_recv(pktdrvint, handle, RCVR_PERMISCUOUS);

					for(;;) {
						if(kbhit())
							if(getch() == 27)
								break;

						if(current_buffer->pktsize_flag) {
																						// perform byte swap on type
							if(eth_filtersrc((ETHER_HEADER far *)
															 (current_buffer->buffer)) ||
								 eth_filterdst((ETHER_HEADER far *)
															 (current_buffer->buffer)))	{

								type_swap((ETHER_HEADER far *)(current_buffer->buffer));

																						// display header output
								dumpheader((ETHER_HEADER far *)(current_buffer->buffer),
														current_buffer->pktsize_flag);

								current_buffer->pktsize_flag = 0;	// reset pktsize flag

								current_buffer = current_buffer->next; // look at next buffer

								received_pkts++;	// increment received_pkts counter
							} else filtered_out_pkts++;
						}		 								// end pkt size flag wait
					} 										// end for loop
					return_code = reltype(pktdrvint, handle);
					fprintf(stdout,"Releasing handle %d\n", handle);
					display_stats(stdout);
				} else {
					fprintf(stderr,"Access handle error %d\n", handle);
					return_code = 1;
				}												// end handle check
			} else {
				fprintf(stderr,"Not installed.\n");
				return_code = 1;
			}													// end get_drvrinfo check

		}	else {
			fprintf(stderr,"Packet driver not found.\n");
			return_code = 1;
		}														// end pkt drive installation check
	}															// end option parsing check
	return(return_code);
}																// end main

