ip_lookup.h revision 369186
1/*
2 * Copyright (C) 2012 by Darren Reed.
3 *
4 * See the IPFILTER.LICENCE file for details on licencing.
5 *
6 * $Id$
7 */
8#ifndef __IP_LOOKUP_H__
9#define __IP_LOOKUP_H__
10
11# define	SIOCLOOKUPADDTABLE	_IOWR('r', 60, struct iplookupop)
12# define	SIOCLOOKUPDELTABLE	_IOWR('r', 61, struct iplookupop)
13# define	SIOCLOOKUPSTAT		_IOWR('r', 64, struct iplookupop)
14# define	SIOCLOOKUPSTATW		_IOW('r', 64, struct iplookupop)
15# define	SIOCLOOKUPFLUSH		_IOWR('r', 65, struct iplookupflush)
16# define	SIOCLOOKUPADDNODE	_IOWR('r', 67, struct iplookupop)
17# define	SIOCLOOKUPADDNODEW	_IOW('r', 67, struct iplookupop)
18# define	SIOCLOOKUPDELNODE	_IOWR('r', 68, struct iplookupop)
19# define	SIOCLOOKUPDELNODEW	_IOW('r', 68, struct iplookupop)
20
21#define	LOOKUP_POOL_MAX	(IPL_LOGSIZE)
22#define	LOOKUP_POOL_SZ	(IPL_LOGSIZE + 1)
23
24typedef	struct	iplookupop	{
25	int	iplo_type;	/* IPLT_* */
26	int	iplo_unit;	/* IPL_LOG* */
27	u_int	iplo_arg;
28	char	iplo_name[FR_GROUPLEN];
29	size_t	iplo_size;	/* sizeof struct at iplo_struct */
30	void	*iplo_struct;
31} iplookupop_t;
32
33#define	LOOKUP_ANON	0x80000000
34
35
36typedef	struct	iplookupflush	{
37	int	iplf_type;	/* IPLT_* */
38	int	iplf_unit;	/* IPL_LOG* */
39	u_int	iplf_arg;
40	u_int	iplf_count;
41	char	iplf_name[FR_GROUPLEN];
42} iplookupflush_t;
43
44typedef	struct	iplookuplink	{
45	int	ipll_type;	/* IPLT_* */
46	int	ipll_unit;	/* IPL_LOG* */
47	u_int	ipll_num;
48	char	ipll_group[FR_GROUPLEN];
49} iplookuplink_t;
50
51#define	IPLT_ALL	-1
52#define	IPLT_NONE	0
53#define	IPLT_POOL	1
54#define	IPLT_HASH	2
55#define	IPLT_DSTLIST	3
56
57
58#define	IPLT_ANON	0x80000000
59
60
61typedef	union	{
62	struct	iplookupiterkey {
63		u_char	ilik_ival;
64		u_char	ilik_type;	/* IPLT_* */
65		u_char	ilik_otype;
66		signed char	ilik_unit;	/* IPL_LOG* */
67	} ilik_unstr;
68	u_32_t	ilik_key;
69} iplookupiterkey_t;
70
71typedef	struct	ipflookupiter	{
72	int			ili_nitems;
73	iplookupiterkey_t	ili_lkey;
74	char			ili_name[FR_GROUPLEN];
75	void			*ili_data;
76} ipflookupiter_t;
77
78#define	ili_key		ili_lkey.ilik_key
79#define	ili_ival	ili_lkey.ilik_unstr.ilik_ival
80#define	ili_unit	ili_lkey.ilik_unstr.ilik_unit
81#define	ili_type	ili_lkey.ilik_unstr.ilik_type
82#define	ili_otype	ili_lkey.ilik_unstr.ilik_otype
83
84#define	IPFLOOKUPITER_LIST	0
85#define	IPFLOOKUPITER_NODE	1
86
87
88typedef struct ipf_lookup {
89	int	ipfl_type;
90	void	*(*ipfl_create) __P((ipf_main_softc_t *));
91	void	(*ipfl_destroy) __P((ipf_main_softc_t *, void *));
92	int	(*ipfl_init) __P((ipf_main_softc_t *, void *));
93	void	(*ipfl_fini) __P((ipf_main_softc_t *, void *));
94	int	(*ipfl_addr_find) __P((ipf_main_softc_t *, void *,
95				       int, void *, u_int));
96	size_t	(*ipfl_flush) __P((ipf_main_softc_t *, void *,
97				   iplookupflush_t *));
98	int	(*ipfl_iter_deref) __P((ipf_main_softc_t *, void *,
99					int, int, void *));
100	int	(*ipfl_iter_next) __P((ipf_main_softc_t *, void *,
101				       ipftoken_t *, ipflookupiter_t *));
102	int	(*ipfl_node_add) __P((ipf_main_softc_t *, void *,
103				      iplookupop_t *, int));
104	int	(*ipfl_node_del) __P((ipf_main_softc_t *, void *,
105				      iplookupop_t *, int));
106	int	(*ipfl_stats_get) __P((ipf_main_softc_t *, void *,
107				       iplookupop_t *));
108	int	(*ipfl_table_add) __P((ipf_main_softc_t *, void *,
109				       iplookupop_t *));
110	int	(*ipfl_table_del) __P((ipf_main_softc_t *, void *,
111				       iplookupop_t *));
112	int	(*ipfl_table_deref) __P((ipf_main_softc_t *, void *, void *));
113	void	*(*ipfl_table_find) __P((void *, int, char *));
114	void	*(*ipfl_select_add_ref) __P((void *, int, char *));
115	int	(*ipfl_select_node) __P((fr_info_t *, void *, u_32_t *,
116					 frdest_t *));
117	void	(*ipfl_expire) __P((ipf_main_softc_t *, void *));
118	void	(*ipfl_sync) __P((ipf_main_softc_t *, void *));
119} ipf_lookup_t;
120
121extern int ipf_lookup_init __P((void));
122extern int ipf_lookup_ioctl __P((ipf_main_softc_t *, caddr_t, ioctlcmd_t, int, int, void *));
123extern void ipf_lookup_main_unload __P((void));
124extern void ipf_lookup_deref __P((ipf_main_softc_t *, int, void *));
125extern void ipf_lookup_iterderef __P((ipf_main_softc_t *, u_32_t, void *));
126extern void *ipf_lookup_res_name __P((ipf_main_softc_t *, int, u_int, char *,
127				      lookupfunc_t *));
128extern void *ipf_lookup_res_num __P((ipf_main_softc_t *, int, u_int, u_int,
129				     lookupfunc_t *));
130extern void ipf_lookup_soft_destroy __P((ipf_main_softc_t *, void *));
131extern void *ipf_lookup_soft_create __P((ipf_main_softc_t *));
132extern int ipf_lookup_soft_init __P((ipf_main_softc_t *, void *));
133extern int ipf_lookup_soft_fini __P((ipf_main_softc_t *, void *));
134extern void *ipf_lookup_find_htable __P((ipf_main_softc_t *, int, char *));
135extern void ipf_lookup_expire __P((ipf_main_softc_t *));
136extern void ipf_lookup_sync __P((ipf_main_softc_t *, void *));
137#ifndef _KERNEL
138extern	void	ipf_lookup_dump __P((ipf_main_softc_t *, void *));
139#endif
140#endif /* __IP_LOOKUP_H__ */
141