#ifndef __MODULE_SOCKET_H
#define __MODULE_SOCKET_H

#include <sys/types.h>
#include "list.h"
#include "forward_engine.h"

#define HASH_SOCKET_SIZE	32
#define HASH_SOCKET(id)		((id) & (HASH_SOCKET_SIZE - 1))

static __inline u_int32_t HASH_SOCK_ADDR(int family, const u_int32_t *Saddr, const u_int32_t *Daddr, u_int16_t Sport, u_int16_t Dport, u_int16_t Proto)
{
	unsigned int a, b;

	if (family == AF_INET)
	{
		a = jhash((void *)Saddr, 4, (Proto << 16) | Proto);
		b = jhash((void *)Daddr, 4, (Sport << 16) | Dport);
	}
	else
	{
        	a = jhash((void *)Saddr, 16, (Proto << 16) | Proto);
        	b = jhash((void *)Daddr, 16, (Sport << 16) | Dport);
	}

	return jhash_2words(a, b, 0x48375934) % HASH_SOCKET_SIZE;
}

#define SOCKET_UNCONNECTED	0
#define SOCKET_CONNECTED		1

#define SOCK_ID_PRIVATE_START	1
#define SOCK_ID_PRIVATE_END	255

#if (SOCK_ID_PRIVATE_START > SOCK_ID_PRIVATE_END)
         #error SOCK_ID_PRIVATE_START cannot be greater than SOCK_ID_PRIVATE_END
#endif

#if (SOCK_ID_PRIVATE_START == 0)
	#error SOCK_ID_PRIVATE_START cannot be zero
#endif

#if (SOCK_ID_PRIVATE_END > 65535)
	#error SOCK_ID_PRIVATE_END cannot be greater than 65535
#endif
#define NUM_INTERNAL_SOCKET_ID	(SOCK_ID_PRIVATE_END - SOCK_ID_PRIVATE_START + 1)
#define SOCK_MAX_ID			0x7FFF

struct socket {
	struct list_head list;
	struct list_head list_by_addr;
	u_int8_t family;
	u_int16_t id;
	u_int8_t type;
	u_int8_t mode;
	u_int32_t saddr[4];
	u_int32_t daddr[4];
	u_int16_t sport;
	u_int16_t dport;
	u_int8_t proto;
	u_int8_t queue;
	u_int16_t dscp;
	struct ct_route rt;
	int flags;
	unsigned int fwmark;
#ifdef COMCERTO_2000
	u_int16_t secure;
	struct FlowEntry *rx_flow;
	struct FlowEntry *tx_flow;
#endif
};

extern struct list_head socket_table[HASH_SOCKET_SIZE];
extern struct list_head socket_table_by_addr[HASH_SOCKET_SIZE];
extern pthread_mutex_t socket_lock;

int socket_daemon(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int fc, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
int cmmSocketSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
int cmmSocketShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
int __socket_open(FCI_CLIENT *fci_handle, struct socket *s);
void socket_remove(struct socket *s);
void __cmmSocketUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route);
struct socket *socket_find_by_addr(int family, const u_int32_t *saddr, const u_int32_t *daddr, u_int16_t sport, u_int16_t dport, u_int16_t proto);
int __socket_close(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct socket *s);
void __socket_add(struct socket * s);
u_int32_t new_socket_id(void);
void del_socket_id(u_int32_t sock_id_ext);

#ifdef COMCERTO_2000
struct socket *__cmmSocketFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig);
#endif


#endif
