#include "../include/traffic.h"

/* Compare IP */
int cmp_ip(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;
	
	if (!opt.rsort)
		return (ntohl(h1->ip.s_addr) < ntohl(h2->ip.s_addr))?-1:1;
	else	
		return (ntohl(h1->ip.s_addr) > ntohl(h2->ip.s_addr))?-1:1;
}

/* Compare data current */
int cmp_data_cur(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->last_in + h1->last_out) > (h2->last_in + h2->last_out))?-1:1;
	else
		return ((h1->last_in + h1->last_out) < (h2->last_in + h2->last_out))?-1:1;
}

/* Comapare data total and average */
int cmp_data_tot(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->tot_in + h1->tot_out) > (h2->tot_in + h2->tot_out))?-1:1;
	else
		return ((h1->tot_in + h1->tot_out) < (h2->tot_in + h2->tot_out))?-1:1;
}

/* Compare data max */
int cmp_data_max(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->max_in + h1->max_out) > (h2->max_in + h2->max_out))?-1:1;
	else
		return ((h1->max_in + h1->max_out) < (h2->max_in + h2->max_out))?-1:1;
}

/* Compare packets current */
int cmp_pkt_cur(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->last_pkt_in + h1->last_pkt_out) > (h2->last_pkt_in + h2->last_pkt_out))?-1:1;
	else
		return ((h1->last_pkt_in + h1->last_pkt_out) < (h2->last_pkt_in + h2->last_pkt_out))?-1:1;
}

/* Compare packets total and average */
int cmp_pkt_tot(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->tot_pkt_in + h1->tot_pkt_out) > (h2->tot_pkt_in + h2->tot_pkt_out))?-1:1;
	else
		return ((h1->tot_pkt_in + h1->tot_pkt_out) < (h2->tot_pkt_in + h2->tot_pkt_out))?-1:1;
}

/* Compare packets max */
int cmp_pkt_max(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->max_pkt_in + h1->max_pkt_out) > (h2->max_pkt_in + h2->max_pkt_out))?-1:1;
	else
		return ((h1->max_pkt_in + h1->max_pkt_out) < (h2->max_pkt_in + h2->max_pkt_out))?-1:1;
}

/* Compare MAC */
int cmp_mac(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;
	int						i;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	for(i=0; i<17; i++) 
		if (h1->mac[i] < h2->mac[i])
			if (!opt.rsort)
				return 1;
			else
				return -1;
	return 1;
}

/* Compare hostname */
int cmp_hostname(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;
	int						i;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	for(i=0; i<24; i++) 
		if (h1->hostname[i] < h2->hostname[i])
			if (!opt.rsort)
				return 1;
			else
				return -1;
	return 1;
}

/* Compare TCP current */
int cmp_tcp(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->last_tcp_in + h1->last_tcp_out) > (h2->last_tcp_in + h2->last_tcp_out))?-1:1;
	else
		return ((h1->last_tcp_in + h1->last_tcp_out) < (h2->last_tcp_in + h2->last_tcp_out))?-1:1;
}

/* Compare UDP current */
int cmp_udp(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->last_udp_in + h1->last_udp_out) > (h2->last_udp_in + h2->last_udp_out))?-1:1;
	else
		return ((h1->last_udp_in + h1->last_udp_out) < (h2->last_udp_in + h2->last_udp_out))?-1:1;
}

/* Compare ICMP current */
int cmp_icmp(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->last_icmp_in + h1->last_icmp_out) > (h2->last_icmp_in + h2->last_icmp_out))?-1:1;
	else
		return ((h1->last_icmp_in + h1->last_icmp_out) < (h2->last_icmp_in + h2->last_icmp_out))?-1:1;
}

/* Comapare TCP total */
int cmp_tcp_tot(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->tot_tcp_in + h1->tot_tcp_out) > (h2->tot_tcp_in + h2->tot_tcp_out))?-1:1;
	else
		return ((h1->tot_tcp_in + h1->tot_tcp_out) < (h2->tot_tcp_in + h2->tot_tcp_out))?-1:1;
}

/* Comapare UDP total */
int cmp_udp_tot(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->tot_udp_in + h1->tot_udp_out) > (h2->tot_udp_in + h2->tot_udp_out))?-1:1;
	else
		return ((h1->tot_udp_in + h1->tot_udp_out) < (h2->tot_udp_in + h2->tot_udp_out))?-1:1;
}

/* Comapare ICMP total */
int cmp_icmp_tot(const void *s1, const void *s2) 
{
	struct host 			*h1, *h2;

	h1 = (struct host *)s1;
	h2 = (struct host *)s2;

	if (!opt.rsort)
		return ((h1->tot_icmp_in + h1->tot_icmp_out) > (h2->tot_icmp_in + h2->tot_icmp_out))?-1:1;
	else
		return ((h1->tot_icmp_in + h1->tot_icmp_out) < (h2->tot_icmp_in + h2->tot_icmp_out))?-1:1;
}



syntax highlighted by Code2HTML, v. 0.9.1