blob: 2fa685d02285bedb3b358c0aaa3ea668014420cf [file] [log] [blame]
#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