#ifndef _INET_ILB_CONN_H
#define _INET_ILB_CONN_H
#ifdef __cplusplus
extern "C" {
#endif
struct ilb_conn_s;
typedef struct ilb_conn_hash_s {
struct ilb_conn_s *ilb_connp;
kmutex_t ilb_conn_hash_lock;
uint32_t ilb_conn_cnt;
#if defined(_LP64)
char ilb_conn_hash_pad[44];
#else
char ilb_conn_hash_pad[52];
#endif
} ilb_conn_hash_t;
typedef struct ilb_rule_info_s {
ilb_topo_impl_t topo;
ilb_nat_info_t info;
} ilb_rule_info_t;
struct ilb_tcp_track {
uint32_t ack;
uint32_t fss;
boolean_t fin_sent;
boolean_t fin_acked;
};
struct ilb_conn_info {
in6_addr_t conn_daddr;
in6_addr_t conn_saddr;
in_port_t conn_dport;
in_port_t conn_sport;
uint32_t conn_ip_sum;
uint32_t conn_tp_sum;
struct ilb_tcp_track conn_tcp_track;
int64_t conn_atime;
uint64_t conn_pkt_cnt;
struct ilb_conn_s *conn_next;
struct ilb_conn_s *conn_prev;
ilb_conn_hash_t *conn_hash;
};
typedef struct ilb_conn_s {
int conn_l4;
int64_t conn_expiry;
int64_t conn_cr_time;
struct ilb_conn_info conn_c2s;
#define conn_c2s_daddr conn_c2s.conn_daddr
#define conn_c2s_saddr conn_c2s.conn_saddr
#define conn_c2s_dport conn_c2s.conn_dport
#define conn_c2s_sport conn_c2s.conn_sport
#define conn_c2s_next conn_c2s.conn_next
#define conn_c2s_prev conn_c2s.conn_prev
#define conn_c2s_hash conn_c2s.conn_hash
#define conn_c2s_atime conn_c2s.conn_atime
#define conn_c2s_pkt_cnt conn_c2s.conn_pkt_cnt
#define conn_c2s_ip_sum conn_c2s.conn_ip_sum
#define conn_c2s_tp_sum conn_c2s.conn_tp_sum
#define conn_c2s_tcp_ack conn_c2s.conn_tcp_track.ack
#define conn_c2s_tcp_fss conn_c2s.conn_tcp_track.fss
#define conn_c2s_tcp_fin_sent conn_c2s.conn_tcp_track.fin_sent
#define conn_c2s_tcp_fin_acked conn_c2s.conn_tcp_track.fin_acked
struct ilb_conn_info conn_s2c;
#define conn_s2c_daddr conn_s2c.conn_daddr
#define conn_s2c_saddr conn_s2c.conn_saddr
#define conn_s2c_dport conn_s2c.conn_dport
#define conn_s2c_sport conn_s2c.conn_sport
#define conn_s2c_next conn_s2c.conn_next
#define conn_s2c_prev conn_s2c.conn_prev
#define conn_s2c_hash conn_s2c.conn_hash
#define conn_s2c_atime conn_s2c.conn_atime
#define conn_s2c_pkt_cnt conn_s2c.conn_pkt_cnt
#define conn_s2c_ip_sum conn_s2c.conn_ip_sum
#define conn_s2c_tp_sum conn_s2c.conn_tp_sum
#define conn_s2c_tcp_ack conn_s2c.conn_tcp_track.ack
#define conn_s2c_tcp_fss conn_s2c.conn_tcp_track.fss
#define conn_s2c_tcp_fin_sent conn_s2c.conn_tcp_track.fin_sent
#define conn_s2c_tcp_fin_acked conn_s2c.conn_tcp_track.fin_acked
ilb_server_t *conn_server;
ilb_rule_info_t conn_rule_cache;
struct ilb_sticky_s *conn_sticky;
boolean_t conn_gc;
} ilb_conn_t;
typedef struct ilb_sticky_hash_s {
list_t sticky_head;
kmutex_t sticky_lock;
uint32_t sticky_cnt;
#if defined(_LP64)
char sticky_pad[20];
#else
char sticky_pad[36];
#endif
} ilb_sticky_hash_t;
typedef struct ilb_sticky_s {
uint_t rule_instance;
char rule_name[ILB_RULE_NAMESZ];
ilb_server_t *server;
in6_addr_t src;
int64_t expiry;
int64_t atime;
int nat_src_idx;
uint32_t refcnt;
list_node_t list;
ilb_sticky_hash_t *hash;
} ilb_sticky_t;
extern void ilb_conn_hash_init(ilb_stack_t *);
extern void ilb_conn_hash_fini(ilb_stack_t *);
extern void ilb_conn_cache_fini(void);
extern void ilb_sticky_hash_init(ilb_stack_t *);
extern void ilb_sticky_hash_fini(ilb_stack_t *);
extern void ilb_sticky_cache_fini(void);
extern boolean_t ilb_check_conn(ilb_stack_t *, int, void *, int, void *,
in6_addr_t *, in6_addr_t *, in_port_t, in_port_t, uint32_t, in6_addr_t *);
extern boolean_t ilb_check_icmp_conn(ilb_stack_t *, mblk_t *, int, void *,
void *, in6_addr_t *);
extern int ilb_conn_add(ilb_stack_t *, ilb_rule_t *, ilb_server_t *,
in6_addr_t *, in_port_t, in6_addr_t *, in_port_t, ilb_nat_info_t *,
uint32_t *, uint32_t *, struct ilb_sticky_s *);
extern ilb_server_t *ilb_sticky_find_add(ilb_stack_t *, ilb_rule_t *,
in6_addr_t *, ilb_server_t *, struct ilb_sticky_s **, uint16_t *);
void ilb_sticky_refrele(struct ilb_sticky_s *);
#ifdef __cplusplus
}
#endif
#endif