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__ */
155