master
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)(ipf_main_softc_t *);
91 void (*ipfl_destroy)(ipf_main_softc_t *, void *);
92 int (*ipfl_init)(ipf_main_softc_t *, void *);
93 void (*ipfl_fini)(ipf_main_softc_t *, void *);
94 int (*ipfl_addr_find)(ipf_main_softc_t *, void *,
95 int, void *, u_int);
96 size_t (*ipfl_flush)(ipf_main_softc_t *, void *,
97 iplookupflush_t *);
98 int (*ipfl_iter_deref)(ipf_main_softc_t *, void *,
99 int, int, void *);
100 int (*ipfl_iter_next)(ipf_main_softc_t *, void *,
101 ipftoken_t *, ipflookupiter_t *);
102 int (*ipfl_node_add)(ipf_main_softc_t *, void *,
103 iplookupop_t *, int);
104 int (*ipfl_node_del)(ipf_main_softc_t *, void *,
105 iplookupop_t *, int);
106 int (*ipfl_stats_get)(ipf_main_softc_t *, void *,
107 iplookupop_t *);
108 int (*ipfl_table_add)(ipf_main_softc_t *, void *,
109 iplookupop_t *);
110 int (*ipfl_table_del)(ipf_main_softc_t *, void *,
111 iplookupop_t *);
112 int (*ipfl_table_deref)(ipf_main_softc_t *, void *, void *);
113 void *(*ipfl_table_find)(void *, int, char *);
114 void *(*ipfl_select_add_ref)(void *, int, char *);
115 int (*ipfl_select_node)(fr_info_t *, void *, u_32_t *,
116 frdest_t *);
117 void (*ipfl_expire)(ipf_main_softc_t *, void *);
118 void (*ipfl_sync)(ipf_main_softc_t *, void *);
119} ipf_lookup_t;
120
121extern int ipf_lookup_init(void);
122extern int ipf_lookup_ioctl(ipf_main_softc_t *, caddr_t, ioctlcmd_t, int, int, void *);
123extern void ipf_lookup_main_unload(void);
124extern void ipf_lookup_deref(ipf_main_softc_t *, int, void *);
125extern void ipf_lookup_iterderef(ipf_main_softc_t *, u_32_t, void *);
126extern void *ipf_lookup_res_name(ipf_main_softc_t *, int, u_int, char *,
127 lookupfunc_t *);
128extern void *ipf_lookup_res_num(ipf_main_softc_t *, int, u_int, u_int,
129 lookupfunc_t *);
130extern void ipf_lookup_soft_destroy(ipf_main_softc_t *, void *);
131extern void *ipf_lookup_soft_create(ipf_main_softc_t *);
132extern int ipf_lookup_soft_init(ipf_main_softc_t *, void *);
133extern int ipf_lookup_soft_fini(ipf_main_softc_t *, void *);
134extern void *ipf_lookup_find_htable(ipf_main_softc_t *, int, char *);
135extern void ipf_lookup_expire(ipf_main_softc_t *);
136extern void ipf_lookup_sync(ipf_main_softc_t *, void *);
137#ifndef _KERNEL
138extern void ipf_lookup_dump(ipf_main_softc_t *, void *);
139#endif
140#endif /* __IP_LOOKUP_H__ */