#ifndef TRAFFIC_H
#define TRAFFIC_H 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in_systm.h>
#include <pcap.h>
#include <ncurses.h>
#include <net/ethernet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <signal.h>
#include <math.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>

#define	BUF_SIZE 128					/* Buffor size */
#define host_len sizeof(struct host)	/* For shortage */
#define MAX_COL 17                   	/* Max number of columns to display */

#define cmp(A, B)   ( !bcmp((A), (B), strlen((A))) )

/* Columns */
#define COL_IP      	1
#define COL_DATA   		2
#define COL_DATA_MAX	3
#define COL_DATA_AVG	4
#define COL_DATA_TOT	5
#define	COL_PKT			6
#define COL_PKT_MAX		7
#define COL_PKT_AVG		8
#define COL_PKT_TOT		9
#define COL_MAC			10
#define COL_HOSTNAME	11
#define COL_TCP			12
#define COL_UDP			13
#define	COL_ICMP		14
#define COL_TCP_TOT		15
#define COL_UDP_TOT		16
#define	COL_ICMP_TOT	17

/* Displaying modes */
#define MODE_STAT	0
#define	MODE_HELP	1

typedef struct ether_header eth_hdr;	/* Ethernet header */
typedef struct ip ip_hdr;				/* IP header */

/* Structure which describe host */
struct host {
	struct in_addr  ip;				/* IP Address */
	char			hostname[32];	/* Hostname */
	char			mac[18];		/* MAC Address */

	u_long          in;				/* Received bytes in last second */
	u_long          out;			/* Sent byte in last second */
	u_long			tcp_in;			/* TCP bytes received in last second */
	u_long			tcp_out;		/* TCP bytes sent in last second */
	u_long			udp_in;			/* UDP bytes received in last second */
	u_long			udp_out;		/* UDP bytes sent in last second */
	u_long			icmp_in;		/* ICMP bytes received in last second */
	u_long			icmp_out;		/* ICMP bytes sent in last second */
	u_long			pkt_in;			/* Current packets in */
	u_long			pkt_out;		/* Current packets out */

	u_long          last_in;		/* Last received bytes in last time */
	u_long          last_out;		/* Last sent byte in last time */
	u_long			last_tcp_in;	/* Last TCP bytes received in last time */
	u_long			last_tcp_out;	/* Last TCP bytes sent in last time */
	u_long			last_udp_in;	/* Last UDP bytes received in last time */
	u_long			last_udp_out;	/* Last UDP bytes sent in last time */
	u_long			last_icmp_in;	/* Last ICMP bytes received in last time */
	u_long			last_icmp_out;	/* Last ICMP bytes sent in last time */
	u_long			last_pkt_in;	/* Current packets in */
	u_long			last_pkt_out;	/* Current packets out */

	u_int64_t		tot_in;			/* Total bytes in */
	u_int64_t		tot_out;		/* Total bytes out */
	u_long			tot_tcp_in;		/* Total TCP bytes received */
	u_long			tot_tcp_out;	/* Total TCP bytes sent */
	u_long			tot_udp_in;		/* Total UDP bytes received */
	u_long			tot_udp_out;	/* Total UDP bytes sent */
	u_long			tot_icmp_in;	/* Total ICMP bytes received */
	u_long			tot_icmp_out;	/* Total ICMP bytes sent */
	u_int64_t		tot_pkt_in;		/* Total packets in */
	u_int64_t		tot_pkt_out;	/* Total packets out */

	u_long			max_in;			/* Max bytes in */
	u_long			max_out;		/* Max bytes out */
	u_long			max_pkt_in;		/* Max packets in */
	u_long			max_pkt_out;	/* Max packets out */
};

/* Structure which describe exluded host or network */
struct ehost {
	struct in_addr  ip;				/* IP Address */
	u_char			netmask;		/* Netmask */
};

/* Options */
struct options {
	char	*dev;				/* Device */
	char	*logfile;			/* Log file */
	u_int	delay;				/* Refresh timeout */
	u_long	times;				/* Number of functions calls to estimate elapsed time */
	u_char	page;				/* Current page to display */
	short	columns[MAX_COL];	/* Diaplaying columns array */
	short	mode;				/* Displaying mode */
	short	sort;				/* Sort column */
	u_char	rsort;				/* Reverse sorting */
	float	unit;				/* Transfer unit */
	char	unit_name[5];		/* Unit name */
	float	unit_t;				/* Total transfer unit */
	char	unit_t_name[5];		/* Total unit name */
	u_short	total;				/* Total disabled */
	char	*exfile;			/* Exclude file */
	char	daemon;				/* Daemon mode disabled by default */
	char	*config;			/* Config file */
	int		discovery;			/* Discover hosts */
	int		private;			/* Only IP private classes */
	int		timeout;			/* Exit after timeout */
	int		revdns;				/* Resolve revdns */
};

/* Callback function to pcap_loop() */
void            got_packet(u_char *args, const struct pcap_pkthdr * header, const u_char * packet);
/* Function which display statistics */
void            show_stats(int sig);
/* Draw statistics on screen */
void			display();
/* Write summarize to file */
void			log_file();
/* Routines */
void invalid_class();
float get_unit(char *s);
void usage();
void daemonize();
int addhost(struct in_addr h);
int addehost(char *h);
int addxhost(char *h);
char *mac2str(u_char * mac);
int inclass(struct in_addr host, struct ehost net);
/* Add, Del column */
void add_column(short col);
void del_column(short col);
/* Printing function */
int print_col(u_char col, u_char pos);
/* Sorting */
int cmp_ip(const void *s1, const void *s2);
int cmp_data_cur(const void *s1, const void *s2);
int cmp_data_tot(const void *s1, const void *s2);
int cmp_data_max(const void *s1, const void *s2);
int cmp_pkt_cur(const void *s1, const void *s2);
int cmp_pkt_tot(const void *s1, const void *s2);
int cmp_pkt_max(const void *s1, const void *s2);
int cmp_mac(const void *s1, const void *s2);
int cmp_hostname(const void *s1, const void *s2);
int cmp_tcp(const void *s1, const void *s2);
int cmp_udp(const void *s1, const void *s2);
int cmp_icmp(const void *s1, const void *s2);
int cmp_tcp_tot(const void *s1, const void *s2);
int cmp_udp_tot(const void *s1, const void *s2);
int cmp_icmp_tot(const void *s1, const void *s2);
#endif

/* Global variables */
extern struct host		*hosts;			/* Hosts array */
extern struct host		total;			/* Summarize */
extern u_int	   		h_num;			/* Number of watched hosts */
extern struct options	opt;			/* Options */
extern char				logfile[];		/* Log filename */
extern WINDOW			*win;			/* Pointer to ncurses window */
extern struct ehost		*ehosts;     	/* Excluded hosts array */
extern struct ehost		*xhosts;     	/* Excluded hosts traffic array */
extern int				eh_num;    		/* Number of excluded hosts */
extern int				xh_num;    		/* Number of excluded hosts traffic */

 
/* Mutexes */
extern short   m_packet;   /* Get packet function mutex */
extern short   m_display;  /* Display function mutex */
extern short   m_file;     /* File logging function mutex */


syntax highlighted by Code2HTML, v. 0.9.1