/*
 * Copyright (C) 2012 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 *
 * $Id: ip_dstlist.h,v 1.5.2.6 2012/07/22 08:04:23 darren_r Exp $
 */

#ifndef	__IP_DSTLIST_H__
#define	__IP_DSTLIST_H__

typedef struct ipf_dstnode {
	struct ipf_dstnode	*ipfd_next;
	struct ipf_dstnode	**ipfd_pnext;
	ipfmutex_t		ipfd_lock;
	frdest_t		ipfd_dest;
	u_long			ipfd_syncat;
	int			ipfd_flags;
	int			ipfd_size;
	int			ipfd_states;
	int			ipfd_ref;
	int			ipfd_uid;
	char			ipfd_names[1];
} ipf_dstnode_t;

typedef enum ippool_policy_e {
	IPLDP_NONE = 0,
	IPLDP_ROUNDROBIN,
	IPLDP_CONNECTION,
	IPLDP_RANDOM,
	IPLDP_HASHED,
	IPLDP_SRCHASH,
	IPLDP_DSTHASH
} ippool_policy_t;

typedef struct ippool_dst {
	struct ippool_dst	*ipld_next;
	struct ippool_dst	**ipld_pnext;
	ipfmutex_t		ipld_lock;
	int			ipld_seed;
	int			ipld_unit;
	int			ipld_ref;
	int			ipld_flags;
	int			ipld_nodes;
	int			ipld_maxnodes;
	ippool_policy_t		ipld_policy;
	ipf_dstnode_t		**ipld_dests;
	ipf_dstnode_t		*ipld_selected;
	char			ipld_name[FR_GROUPLEN];
} ippool_dst_t;

#define	IPDST_DELETE		0x01

typedef	struct dstlist_stat_s {
	void			*ipls_list[LOOKUP_POOL_SZ];
	int			ipls_numlists;
	u_long			ipls_nomem;
	int			ipls_numnodes;
	int			ipls_numdereflists;
	int			ipls_numderefnodes;
} ipf_dstl_stat_t;

extern ipf_lookup_t ipf_dstlist_backend;

extern int ipf_dstlist_select_node(fr_info_t *, void *, u_32_t *,
					frdest_t *);

#endif /* __IP_DSTLIST_H__ */