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