npf_impl.h revision 1.3.2.2 1 1.3.2.2 yamt /* $NetBSD: npf_impl.h,v 1.3.2.2 2010/10/09 03:32:37 yamt Exp $ */
2 1.3.2.2 yamt
3 1.3.2.2 yamt /*-
4 1.3.2.2 yamt * Copyright (c) 2009-2010 The NetBSD Foundation, Inc.
5 1.3.2.2 yamt * All rights reserved.
6 1.3.2.2 yamt *
7 1.3.2.2 yamt * This material is based upon work partially supported by The
8 1.3.2.2 yamt * NetBSD Foundation under a contract with Mindaugas Rasiukevicius.
9 1.3.2.2 yamt *
10 1.3.2.2 yamt * Redistribution and use in source and binary forms, with or without
11 1.3.2.2 yamt * modification, are permitted provided that the following conditions
12 1.3.2.2 yamt * are met:
13 1.3.2.2 yamt * 1. Redistributions of source code must retain the above copyright
14 1.3.2.2 yamt * notice, this list of conditions and the following disclaimer.
15 1.3.2.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
16 1.3.2.2 yamt * notice, this list of conditions and the following disclaimer in the
17 1.3.2.2 yamt * documentation and/or other materials provided with the distribution.
18 1.3.2.2 yamt *
19 1.3.2.2 yamt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.3.2.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.3.2.2 yamt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.3.2.2 yamt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.3.2.2 yamt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.3.2.2 yamt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.3.2.2 yamt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.3.2.2 yamt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.3.2.2 yamt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.3.2.2 yamt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.3.2.2 yamt * POSSIBILITY OF SUCH DAMAGE.
30 1.3.2.2 yamt */
31 1.3.2.2 yamt
32 1.3.2.2 yamt /*
33 1.3.2.2 yamt * Private NPF structures and interfaces.
34 1.3.2.2 yamt * For internal use within NPF core only.
35 1.3.2.2 yamt */
36 1.3.2.2 yamt
37 1.3.2.2 yamt #ifndef _NPF_IMPL_H_
38 1.3.2.2 yamt #define _NPF_IMPL_H_
39 1.3.2.2 yamt
40 1.3.2.2 yamt #include <sys/rbtree.h>
41 1.3.2.2 yamt #include <sys/hash.h>
42 1.3.2.2 yamt #include <sys/queue.h>
43 1.3.2.2 yamt #include <sys/types.h>
44 1.3.2.2 yamt #include <sys/rwlock.h>
45 1.3.2.2 yamt
46 1.3.2.2 yamt #include "npf.h"
47 1.3.2.2 yamt #include "npf_ncode.h"
48 1.3.2.2 yamt
49 1.3.2.2 yamt #ifdef _NPF_TESTING
50 1.3.2.2 yamt #include "testing.h"
51 1.3.2.2 yamt #endif
52 1.3.2.2 yamt
53 1.3.2.2 yamt /*
54 1.3.2.2 yamt * STRUCTURE DECLARATIONS.
55 1.3.2.2 yamt *
56 1.3.2.2 yamt * Note: ruleset interface declarations are public.
57 1.3.2.2 yamt */
58 1.3.2.2 yamt
59 1.3.2.2 yamt struct npf_nat;
60 1.3.2.2 yamt struct npf_session;
61 1.3.2.2 yamt
62 1.3.2.2 yamt typedef struct npf_nat npf_nat_t;
63 1.3.2.2 yamt typedef struct npf_alg npf_alg_t;
64 1.3.2.2 yamt typedef struct npf_natpolicy npf_natpolicy_t;
65 1.3.2.2 yamt typedef struct npf_session npf_session_t;
66 1.3.2.2 yamt
67 1.3.2.2 yamt struct npf_tblent;
68 1.3.2.2 yamt struct npf_table;
69 1.3.2.2 yamt
70 1.3.2.2 yamt typedef struct npf_tblent npf_tblent_t;
71 1.3.2.2 yamt typedef struct npf_table npf_table_t;
72 1.3.2.2 yamt
73 1.3.2.2 yamt typedef npf_table_t * npf_tableset_t;
74 1.3.2.2 yamt
75 1.3.2.2 yamt /*
76 1.3.2.2 yamt * DEFINITIONS.
77 1.3.2.2 yamt */
78 1.3.2.2 yamt
79 1.3.2.2 yamt typedef bool (*npf_algfunc_t)(npf_cache_t *, void *, void *);
80 1.3.2.2 yamt
81 1.3.2.2 yamt #define NPF_NCODE_LIMIT 1024
82 1.3.2.2 yamt #define NPF_TABLE_SLOTS 32
83 1.3.2.2 yamt
84 1.3.2.2 yamt /*
85 1.3.2.2 yamt * INTERFACES.
86 1.3.2.2 yamt */
87 1.3.2.2 yamt
88 1.3.2.2 yamt /* NPF control. */
89 1.3.2.2 yamt int npfctl_switch(void *);
90 1.3.2.2 yamt int npfctl_reload(u_long, void *);
91 1.3.2.2 yamt int npfctl_table(void *);
92 1.3.2.2 yamt
93 1.3.2.2 yamt /* Packet filter hooks. */
94 1.3.2.2 yamt int npf_register_pfil(void);
95 1.3.2.2 yamt void npf_unregister_pfil(void);
96 1.3.2.2 yamt
97 1.3.2.2 yamt /* Protocol helpers. */
98 1.3.2.2 yamt bool npf_ip4_proto(npf_cache_t *, nbuf_t *, void *);
99 1.3.2.2 yamt bool npf_fetch_ip4addrs(npf_cache_t *, nbuf_t *, void *);
100 1.3.2.2 yamt bool npf_fetch_ports(npf_cache_t *, nbuf_t *, void *, const int);
101 1.3.2.2 yamt bool npf_fetch_tcpfl(npf_cache_t *, nbuf_t *, void *);
102 1.3.2.2 yamt bool npf_fetch_icmp(npf_cache_t *, nbuf_t *, void *);
103 1.3.2.2 yamt bool npf_cache_all(npf_cache_t *, nbuf_t *);
104 1.3.2.2 yamt
105 1.3.2.2 yamt bool npf_rwrport(npf_cache_t *, nbuf_t *, void *, const int,
106 1.3.2.2 yamt in_port_t, in_addr_t);
107 1.3.2.2 yamt bool npf_rwrip(npf_cache_t *, nbuf_t *, void *, const int, in_addr_t);
108 1.3.2.2 yamt
109 1.3.2.2 yamt uint16_t npf_fixup16_cksum(uint16_t, uint16_t, uint16_t);
110 1.3.2.2 yamt uint16_t npf_fixup32_cksum(uint16_t, uint32_t, uint32_t);
111 1.3.2.2 yamt
112 1.3.2.2 yamt void npf_return_block(npf_cache_t *, nbuf_t *, const int);
113 1.3.2.2 yamt
114 1.3.2.2 yamt /* Complex instructions. */
115 1.3.2.2 yamt int npf_match_ether(nbuf_t *, int, int, uint16_t, uint32_t *);
116 1.3.2.2 yamt int npf_match_ip4table(npf_cache_t *, nbuf_t *, void *,
117 1.3.2.2 yamt const int, const u_int);
118 1.3.2.2 yamt int npf_match_ip4mask(npf_cache_t *, nbuf_t *, void *,
119 1.3.2.2 yamt const int, in_addr_t, in_addr_t);
120 1.3.2.2 yamt int npf_match_tcp_ports(npf_cache_t *, nbuf_t *, void *,
121 1.3.2.2 yamt const int, const uint32_t);
122 1.3.2.2 yamt int npf_match_udp_ports(npf_cache_t *, nbuf_t *, void *,
123 1.3.2.2 yamt const int, const uint32_t);
124 1.3.2.2 yamt int npf_match_icmp4(npf_cache_t *, nbuf_t *, void *, const uint32_t);
125 1.3.2.2 yamt int npf_match_tcpfl(npf_cache_t *, nbuf_t *, void *, const uint32_t);
126 1.3.2.2 yamt
127 1.3.2.2 yamt /* Tableset interface. */
128 1.3.2.2 yamt int npf_tableset_sysinit(void);
129 1.3.2.2 yamt void npf_tableset_sysfini(void);
130 1.3.2.2 yamt
131 1.3.2.2 yamt npf_tableset_t *npf_tableset_create(void);
132 1.3.2.2 yamt void npf_tableset_destroy(npf_tableset_t *);
133 1.3.2.2 yamt int npf_tableset_insert(npf_tableset_t *, npf_table_t *);
134 1.3.2.2 yamt npf_tableset_t *npf_tableset_reload(npf_tableset_t *);
135 1.3.2.2 yamt
136 1.3.2.2 yamt npf_table_t * npf_table_create(u_int, int, size_t);
137 1.3.2.2 yamt void npf_table_destroy(npf_table_t *);
138 1.3.2.2 yamt void npf_table_ref(npf_table_t *);
139 1.3.2.2 yamt void npf_table_unref(npf_table_t *);
140 1.3.2.2 yamt
141 1.3.2.2 yamt npf_table_t * npf_table_get(npf_tableset_t *, u_int);
142 1.3.2.2 yamt void npf_table_put(npf_table_t *);
143 1.3.2.2 yamt int npf_table_check(npf_tableset_t *, u_int, int);
144 1.3.2.2 yamt int npf_table_add_v4cidr(npf_tableset_t *, u_int,
145 1.3.2.2 yamt in_addr_t, in_addr_t);
146 1.3.2.2 yamt int npf_table_rem_v4cidr(npf_tableset_t *, u_int,
147 1.3.2.2 yamt in_addr_t, in_addr_t);
148 1.3.2.2 yamt int npf_table_match_v4addr(u_int, in_addr_t);
149 1.3.2.2 yamt
150 1.3.2.2 yamt /* Ruleset interface. */
151 1.3.2.2 yamt int npf_ruleset_sysinit(void);
152 1.3.2.2 yamt void npf_ruleset_sysfini(void);
153 1.3.2.2 yamt
154 1.3.2.2 yamt npf_ruleset_t * npf_ruleset_create(void);
155 1.3.2.2 yamt void npf_ruleset_destroy(npf_ruleset_t *);
156 1.3.2.2 yamt void npf_ruleset_insert(npf_ruleset_t *, npf_rule_t *);
157 1.3.2.2 yamt void npf_ruleset_reload(npf_ruleset_t *, npf_tableset_t *);
158 1.3.2.2 yamt
159 1.3.2.2 yamt npf_rule_t * npf_ruleset_match(npf_ruleset_t *, npf_cache_t *, nbuf_t *,
160 1.3.2.2 yamt struct ifnet *, const int, const int);
161 1.3.2.2 yamt npf_rule_t * npf_ruleset_inspect(npf_cache_t *, nbuf_t *,
162 1.3.2.2 yamt struct ifnet *, const int, const int);
163 1.3.2.2 yamt int npf_rule_apply(const npf_cache_t *, npf_rule_t *, bool *, int *);
164 1.3.2.2 yamt npf_ruleset_t * npf_rule_subset(npf_rule_t *);
165 1.3.2.2 yamt
166 1.3.2.2 yamt npf_natpolicy_t *npf_rule_getnat(const npf_rule_t *);
167 1.3.2.2 yamt void npf_rule_setnat(npf_rule_t *, npf_natpolicy_t *);
168 1.3.2.2 yamt
169 1.3.2.2 yamt /* State handling interface. */
170 1.3.2.2 yamt int npf_session_sysinit(void);
171 1.3.2.2 yamt void npf_session_sysfini(void);
172 1.3.2.2 yamt int npf_session_tracking(bool);
173 1.3.2.2 yamt
174 1.3.2.2 yamt npf_session_t * npf_session_inspect(npf_cache_t *, nbuf_t *,
175 1.3.2.2 yamt struct ifnet *, const int);
176 1.3.2.2 yamt npf_session_t * npf_session_establish(const npf_cache_t *,
177 1.3.2.2 yamt npf_nat_t *, const int);
178 1.3.2.2 yamt void npf_session_release(npf_session_t *);
179 1.3.2.2 yamt bool npf_session_pass(const npf_session_t *);
180 1.3.2.2 yamt void npf_session_setpass(npf_session_t *);
181 1.3.2.2 yamt void npf_session_link(npf_session_t *, npf_session_t *);
182 1.3.2.2 yamt npf_nat_t * npf_session_retnat(npf_session_t *, const int, bool *);
183 1.3.2.2 yamt
184 1.3.2.2 yamt /* NAT. */
185 1.3.2.2 yamt void npf_nat_sysinit(void);
186 1.3.2.2 yamt void npf_nat_sysfini(void);
187 1.3.2.2 yamt npf_natpolicy_t *npf_nat_newpolicy(int, int, in_addr_t, in_port_t);
188 1.3.2.2 yamt void npf_nat_freepolicy(npf_natpolicy_t *);
189 1.3.2.2 yamt void npf_nat_flush(void);
190 1.3.2.2 yamt void npf_nat_reload(npf_ruleset_t *);
191 1.3.2.2 yamt
192 1.3.2.2 yamt int npf_do_nat(npf_cache_t *, npf_session_t *, nbuf_t *,
193 1.3.2.2 yamt struct ifnet *, const int);
194 1.3.2.2 yamt void npf_nat_expire(npf_nat_t *);
195 1.3.2.2 yamt void npf_nat_getorig(npf_nat_t *, in_addr_t *, in_port_t *);
196 1.3.2.2 yamt void npf_nat_setalg(npf_nat_t *, npf_alg_t *, uintptr_t);
197 1.3.2.2 yamt
198 1.3.2.2 yamt /* ALG interface. */
199 1.3.2.2 yamt void npf_alg_sysinit(void);
200 1.3.2.2 yamt void npf_alg_sysfini(void);
201 1.3.2.2 yamt npf_alg_t * npf_alg_register(npf_algfunc_t, npf_algfunc_t,
202 1.3.2.2 yamt npf_algfunc_t, npf_algfunc_t);
203 1.3.2.2 yamt int npf_alg_unregister(npf_alg_t *);
204 1.3.2.2 yamt void npf_alg_match(npf_cache_t *, nbuf_t *, npf_nat_t *);
205 1.3.2.2 yamt void npf_alg_exec(npf_cache_t *, nbuf_t *, npf_nat_t *, const int );
206 1.3.2.2 yamt bool npf_alg_sessionid(npf_cache_t *, nbuf_t *, npf_cache_t *);
207 1.3.2.2 yamt
208 1.3.2.2 yamt /* Debugging routines. */
209 1.3.2.2 yamt void npf_rulenc_dump(npf_rule_t *);
210 1.3.2.2 yamt void npf_sessions_dump(void);
211 1.3.2.2 yamt void npf_nat_dump(npf_nat_t *);
212 1.3.2.2 yamt
213 1.3.2.2 yamt #endif
214