1 /*
2  * Copyright (C) 1993-2001, 2003 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  *
6  * $Id: ip_pool.h,v 2.26.2.3 2005/06/12 07:18:27 darrenr Exp $
7  *
8  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
9  */
10 
11 #ifndef	__IP_POOL_H__
12 #define	__IP_POOL_H__
13 
14 #if defined(_KERNEL) && !defined(__osf__) && !defined(__hpux) && \
15     !defined(linux) && !defined(sun) && !defined(AIX)
16 # include <net/radix.h>
17 extern void rn_freehead __P((struct radix_node_head *));
18 # define FreeS(p, z)		KFREES(p, z)
19 extern int max_keylen;
20 #else
21 # if defined(__osf__) || defined(__hpux)
22 #  include "radix_ipf_local.h"
23 #  define radix_mask ipf_radix_mask
24 #  define radix_node ipf_radix_node
25 #  define radix_node_head ipf_radix_node_head
26 # else
27 #  include "radix_ipf.h"
28 # endif
29 #endif
30 #include "netinet/ip_lookup.h"
31 
32 #define	IP_POOL_NOMATCH		0
33 #define	IP_POOL_POSITIVE	1
34 
35 typedef	struct ip_pool_node {
36 	struct	radix_node	ipn_nodes[2];
37 	addrfamily_t		ipn_addr;
38 	addrfamily_t		ipn_mask;
39 	int			ipn_info;
40 	int			ipn_ref;
41 	char			ipn_name[FR_GROUPLEN];
42 	U_QUAD_T		ipn_hits;
43 	U_QUAD_T		ipn_bytes;
44 	struct ip_pool_node	*ipn_next, **ipn_pnext;
45 } ip_pool_node_t;
46 
47 
48 typedef	struct ip_pool_s {
49 	struct ip_pool_s	*ipo_next;
50 	struct ip_pool_s	**ipo_pnext;
51 	struct radix_node_head	*ipo_head;
52 	ip_pool_node_t	*ipo_list;
53 	U_QUAD_T	ipo_hits;
54 	int		ipo_unit;
55 	int		ipo_flags;
56 	int		ipo_ref;
57 	char		ipo_name[FR_GROUPLEN];
58 } ip_pool_t;
59 
60 #define	IPOOL_ANON	0x80000000
61 
62 
63 typedef	struct	ip_pool_stat	{
64 	u_long		ipls_pools;
65 	u_long		ipls_tables;
66 	u_long		ipls_nodes;
67 	ip_pool_t	*ipls_list[IPL_LOGSIZE];
68 } ip_pool_stat_t;
69 
70 extern	int	ip_pool_search __P((void *, int, void *, fr_info_t *, ipf_stack_t *));
71 extern	int	ip_pool_init __P((ipf_stack_t *));
72 extern	void	ip_pool_fini __P((ipf_stack_t *));
73 extern	int	ip_pool_create __P((iplookupop_t *, ipf_stack_t *));
74 extern	int	ip_pool_insert __P((ip_pool_t *, addrfamily_t *,
75 				    addrfamily_t *, int, ipf_stack_t *));
76 extern	int	ip_pool_remove __P((ip_pool_t *, ip_pool_node_t *,
77 				    ipf_stack_t *));
78 extern	int	ip_pool_destroy __P((iplookupop_t *, ipf_stack_t *));
79 extern	void	ip_pool_free __P((ip_pool_t *, ipf_stack_t *));
80 extern	void	ip_pool_deref __P((ip_pool_t *, ipf_stack_t *));
81 extern	void	*ip_pool_find __P((int, char *, ipf_stack_t *));
82 extern	ip_pool_node_t *ip_pool_findeq __P((ip_pool_t *,
83 					  addrfamily_t *, addrfamily_t *));
84 extern	int	ip_pool_flush __P((iplookupflush_t *, ipf_stack_t *));
85 extern	int	ip_pool_statistics __P((iplookupop_t *, ipf_stack_t *));
86 extern	int	ip_pool_getnext __P((ipftoken_t *, ipflookupiter_t *, ipf_stack_t *));
87 extern	void	ip_pool_iterderef __P((u_int, int, void *, ipf_stack_t *));
88 #endif /* __IP_POOL_H__ */
89