root/sys/netpfil/ipfilter/netinet/ip_dstlist.h
/*
 * 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__ */