Deleted Added
full compact
pf_table.c (126259) pf_table.c (126261)
1/* $FreeBSD: head/sys/contrib/pf/net/pf_table.c 126261 2004-02-26 02:34:12Z mlaier $ */
1/* $OpenBSD: pf_table.c,v 1.41 2003/08/22 15:19:23 henning Exp $ */
2
3/*
4 * Copyright (c) 2002 Cedric Berger
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 16 unchanged lines hidden (view full) ---

25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
2/* $OpenBSD: pf_table.c,v 1.41 2003/08/22 15:19:23 henning Exp $ */
3
4/*
5 * Copyright (c) 2002 Cedric Berger
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions

--- 16 unchanged lines hidden (view full) ---

26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#if defined(__FreeBSD__)
35#include "opt_inet.h"
36#include "opt_inet6.h"
37#endif
38
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/socket.h>
36#include <sys/mbuf.h>
37#include <sys/kernel.h>
39#include <sys/param.h>
40#include <sys/systm.h>
41#include <sys/socket.h>
42#include <sys/mbuf.h>
43#include <sys/kernel.h>
44#if defined(__FreeBSD__)
45#include <sys/malloc.h>
46#endif
38
39#include <net/if.h>
40#include <net/route.h>
41#include <netinet/in.h>
47
48#include <net/if.h>
49#include <net/route.h>
50#include <netinet/in.h>
51#if !defined(__FreeBSD__)
42#include <netinet/ip_ipsp.h>
52#include <netinet/ip_ipsp.h>
53#endif
54
43#include <net/pfvar.h>
44
55#include <net/pfvar.h>
56
57#if defined(FreeBSD__)
58MALLOC_DECLARE(M_RTABLE);
59#endif
60
45#define ACCEPT_FLAGS(oklist) \
46 do { \
47 if ((flags & ~(oklist)) & \
48 PFR_FLAG_ALLMASK) \
49 return (EINVAL); \
50 } while (0)
51
52#define FILLIN_SIN(sin, addr) \

--- 51 unchanged lines hidden (view full) ---

104#define pfrw_addr pfrw_1.pfrw1_addr
105#define pfrw_astats pfrw_1.pfrw1_astats
106#define pfrw_workq pfrw_1.pfrw1_workq
107#define pfrw_kentry pfrw_1.pfrw1_kentry
108#define pfrw_cnt pfrw_free
109
110#define senderr(e) do { rv = (e); goto _bad; } while (0)
111
61#define ACCEPT_FLAGS(oklist) \
62 do { \
63 if ((flags & ~(oklist)) & \
64 PFR_FLAG_ALLMASK) \
65 return (EINVAL); \
66 } while (0)
67
68#define FILLIN_SIN(sin, addr) \

--- 51 unchanged lines hidden (view full) ---

120#define pfrw_addr pfrw_1.pfrw1_addr
121#define pfrw_astats pfrw_1.pfrw1_astats
122#define pfrw_workq pfrw_1.pfrw1_workq
123#define pfrw_kentry pfrw_1.pfrw1_kentry
124#define pfrw_cnt pfrw_free
125
126#define senderr(e) do { rv = (e); goto _bad; } while (0)
127
128#if defined(__FreeBSD__)
129uma_zone_t pfr_ktable_pl;
130uma_zone_t pfr_kentry_pl;
131#else
112struct pool pfr_ktable_pl;
113struct pool pfr_kentry_pl;
132struct pool pfr_ktable_pl;
133struct pool pfr_kentry_pl;
134#endif
114struct sockaddr_in pfr_sin;
115struct sockaddr_in6 pfr_sin6;
116union sockaddr_union pfr_mask;
117struct pf_addr pfr_ffaddr;
118
119void pfr_copyout_addr(struct pfr_addr *,
120 struct pfr_kentry *ke);
121int pfr_validate_addr(struct pfr_addr *);

--- 28 unchanged lines hidden (view full) ---

150 int);
151void pfr_clstats_ktable(struct pfr_ktable *, long, int);
152struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int);
153void pfr_destroy_ktables(struct pfr_ktableworkq *, int);
154void pfr_destroy_ktable(struct pfr_ktable *, int);
155int pfr_ktable_compare(struct pfr_ktable *,
156 struct pfr_ktable *);
157struct pfr_ktable *pfr_lookup_table(struct pfr_table *);
135struct sockaddr_in pfr_sin;
136struct sockaddr_in6 pfr_sin6;
137union sockaddr_union pfr_mask;
138struct pf_addr pfr_ffaddr;
139
140void pfr_copyout_addr(struct pfr_addr *,
141 struct pfr_kentry *ke);
142int pfr_validate_addr(struct pfr_addr *);

--- 28 unchanged lines hidden (view full) ---

171 int);
172void pfr_clstats_ktable(struct pfr_ktable *, long, int);
173struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int);
174void pfr_destroy_ktables(struct pfr_ktableworkq *, int);
175void pfr_destroy_ktable(struct pfr_ktable *, int);
176int pfr_ktable_compare(struct pfr_ktable *,
177 struct pfr_ktable *);
178struct pfr_ktable *pfr_lookup_table(struct pfr_table *);
158void pfr_clean_node_mask(struct pfr_ktable *,
179void pfr_clean_node_mask(struct pfr_ktable *,
159 struct pfr_kentryworkq *);
160int pfr_table_count(struct pfr_table *, int);
161int pfr_skip_table(struct pfr_table *,
162 struct pfr_ktable *, int);
163struct pfr_kentry *pfr_kentry_byidx(struct pfr_ktable *, int, int);
164
165RB_PROTOTYPE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
166RB_GENERATE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
167
168struct pfr_ktablehead pfr_ktables;
169struct pfr_table pfr_nulltable;
170int pfr_ktable_cnt;
171
172void
173pfr_initialize(void)
174{
180 struct pfr_kentryworkq *);
181int pfr_table_count(struct pfr_table *, int);
182int pfr_skip_table(struct pfr_table *,
183 struct pfr_ktable *, int);
184struct pfr_kentry *pfr_kentry_byidx(struct pfr_ktable *, int, int);
185
186RB_PROTOTYPE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
187RB_GENERATE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
188
189struct pfr_ktablehead pfr_ktables;
190struct pfr_table pfr_nulltable;
191int pfr_ktable_cnt;
192
193void
194pfr_initialize(void)
195{
196#if !defined(__FreeBSD__)
175 pool_init(&pfr_ktable_pl, sizeof(struct pfr_ktable), 0, 0, 0,
176 "pfrktable", NULL);
177 pool_init(&pfr_kentry_pl, sizeof(struct pfr_kentry), 0, 0, 0,
178 "pfrkentry", NULL);
197 pool_init(&pfr_ktable_pl, sizeof(struct pfr_ktable), 0, 0, 0,
198 "pfrktable", NULL);
199 pool_init(&pfr_kentry_pl, sizeof(struct pfr_kentry), 0, 0, 0,
200 "pfrkentry", NULL);
201#endif
179
180 pfr_sin.sin_len = sizeof(pfr_sin);
181 pfr_sin.sin_family = AF_INET;
182 pfr_sin6.sin6_len = sizeof(pfr_sin6);
183 pfr_sin6.sin6_family = AF_INET6;
184
185 memset(&pfr_ffaddr, 0xff, sizeof(pfr_ffaddr));
186}

--- 34 unchanged lines hidden (view full) ---

221pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
222 int *nadd, int flags)
223{
224 struct pfr_ktable *kt, *tmpkt;
225 struct pfr_kentryworkq workq;
226 struct pfr_kentry *p, *q;
227 struct pfr_addr ad;
228 int i, rv, s, xadd = 0;
202
203 pfr_sin.sin_len = sizeof(pfr_sin);
204 pfr_sin.sin_family = AF_INET;
205 pfr_sin6.sin6_len = sizeof(pfr_sin6);
206 pfr_sin6.sin6_family = AF_INET6;
207
208 memset(&pfr_ffaddr, 0xff, sizeof(pfr_ffaddr));
209}

--- 34 unchanged lines hidden (view full) ---

244pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
245 int *nadd, int flags)
246{
247 struct pfr_ktable *kt, *tmpkt;
248 struct pfr_kentryworkq workq;
249 struct pfr_kentry *p, *q;
250 struct pfr_addr ad;
251 int i, rv, s, xadd = 0;
252#if defined(__FreeBSD__)
253 int ec;
254 /*
255 * XXX Is it OK under LP64 environments?
256 */
257 long tzero = (long)time_second;
258#else
229 long tzero = time.tv_sec;
259 long tzero = time.tv_sec;
260#endif
230
231 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
232 if (pfr_validate_table(tbl, 0))
233 return (EINVAL);
234 kt = pfr_lookup_table(tbl);
235 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
236 return (ESRCH);
237 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
238 return (EPERM);
239 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
240 if (tmpkt == NULL)
241 return (ENOMEM);
242 SLIST_INIT(&workq);
243 for (i = 0; i < size; i++) {
261
262 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
263 if (pfr_validate_table(tbl, 0))
264 return (EINVAL);
265 kt = pfr_lookup_table(tbl);
266 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
267 return (ESRCH);
268 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
269 return (EPERM);
270 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
271 if (tmpkt == NULL)
272 return (ENOMEM);
273 SLIST_INIT(&workq);
274 for (i = 0; i < size; i++) {
275#if defined(__FreeBSD__)
276 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
277 if (ec)
278 senderr(EFAULT);
279#else
244 if (copyin(addr+i, &ad, sizeof(ad)))
245 senderr(EFAULT);
280 if (copyin(addr+i, &ad, sizeof(ad)))
281 senderr(EFAULT);
282#endif
246 if (pfr_validate_addr(&ad))
247 senderr(EINVAL);
248 p = pfr_lookup_addr(kt, &ad, 1);
249 q = pfr_lookup_addr(tmpkt, &ad, 1);
250 if (flags & PFR_FLAG_FEEDBACK) {
251 if (q != NULL)
252 ad.pfra_fback = PFR_FB_DUPLICATE;
253 else if (p == NULL)

--- 10 unchanged lines hidden (view full) ---

264 if (pfr_route_kentry(tmpkt, p)) {
265 pfr_destroy_kentry(p);
266 ad.pfra_fback = PFR_FB_NONE;
267 } else {
268 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
269 xadd++;
270 }
271 }
283 if (pfr_validate_addr(&ad))
284 senderr(EINVAL);
285 p = pfr_lookup_addr(kt, &ad, 1);
286 q = pfr_lookup_addr(tmpkt, &ad, 1);
287 if (flags & PFR_FLAG_FEEDBACK) {
288 if (q != NULL)
289 ad.pfra_fback = PFR_FB_DUPLICATE;
290 else if (p == NULL)

--- 10 unchanged lines hidden (view full) ---

301 if (pfr_route_kentry(tmpkt, p)) {
302 pfr_destroy_kentry(p);
303 ad.pfra_fback = PFR_FB_NONE;
304 } else {
305 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
306 xadd++;
307 }
308 }
309#if defined(__FreeBSD__)
310 if (flags & PFR_FLAG_FEEDBACK) {
311 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
312 if (ec)
313 senderr(EFAULT);
314 }
315#else
272 if (flags & PFR_FLAG_FEEDBACK)
273 if (copyout(&ad, addr+i, sizeof(ad)))
274 senderr(EFAULT);
316 if (flags & PFR_FLAG_FEEDBACK)
317 if (copyout(&ad, addr+i, sizeof(ad)))
318 senderr(EFAULT);
319#endif
275 }
276 pfr_clean_node_mask(tmpkt, &workq);
277 if (!(flags & PFR_FLAG_DUMMY)) {
278 if (flags & PFR_FLAG_ATOMIC)
279 s = splsoftnet();
280 pfr_insert_kentries(kt, &workq, tzero);
281 if (flags & PFR_FLAG_ATOMIC)
282 splx(s);

--- 16 unchanged lines hidden (view full) ---

299pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
300 int *ndel, int flags)
301{
302 struct pfr_ktable *kt;
303 struct pfr_kentryworkq workq;
304 struct pfr_kentry *p;
305 struct pfr_addr ad;
306 int i, rv, s, xdel = 0;
320 }
321 pfr_clean_node_mask(tmpkt, &workq);
322 if (!(flags & PFR_FLAG_DUMMY)) {
323 if (flags & PFR_FLAG_ATOMIC)
324 s = splsoftnet();
325 pfr_insert_kentries(kt, &workq, tzero);
326 if (flags & PFR_FLAG_ATOMIC)
327 splx(s);

--- 16 unchanged lines hidden (view full) ---

344pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
345 int *ndel, int flags)
346{
347 struct pfr_ktable *kt;
348 struct pfr_kentryworkq workq;
349 struct pfr_kentry *p;
350 struct pfr_addr ad;
351 int i, rv, s, xdel = 0;
352#if defined(__FreeBSD__)
353 int ec;
354#endif
307
308 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
309 if (pfr_validate_table(tbl, 0))
310 return (EINVAL);
311 kt = pfr_lookup_table(tbl);
312 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
313 return (ESRCH);
314 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
315 return (EPERM);
316 pfr_mark_addrs(kt);
317 SLIST_INIT(&workq);
318 for (i = 0; i < size; i++) {
355
356 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
357 if (pfr_validate_table(tbl, 0))
358 return (EINVAL);
359 kt = pfr_lookup_table(tbl);
360 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
361 return (ESRCH);
362 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
363 return (EPERM);
364 pfr_mark_addrs(kt);
365 SLIST_INIT(&workq);
366 for (i = 0; i < size; i++) {
367#if defined(__FreeBSD__)
368 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
369 if (ec)
370 senderr(EFAULT);
371#else
319 if (copyin(addr+i, &ad, sizeof(ad)))
320 senderr(EFAULT);
372 if (copyin(addr+i, &ad, sizeof(ad)))
373 senderr(EFAULT);
374#endif
321 if (pfr_validate_addr(&ad))
322 senderr(EINVAL);
323 p = pfr_lookup_addr(kt, &ad, 1);
324 if (flags & PFR_FLAG_FEEDBACK) {
325 if (p == NULL)
326 ad.pfra_fback = PFR_FB_NONE;
327 else if (p->pfrke_not != ad.pfra_not)
328 ad.pfra_fback = PFR_FB_CONFLICT;
329 else if (p->pfrke_mark)
330 ad.pfra_fback = PFR_FB_DUPLICATE;
331 else
332 ad.pfra_fback = PFR_FB_DELETED;
333 }
334 if (p != NULL && p->pfrke_not == ad.pfra_not &&
335 !p->pfrke_mark) {
336 p->pfrke_mark = 1;
337 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
338 xdel++;
339 }
375 if (pfr_validate_addr(&ad))
376 senderr(EINVAL);
377 p = pfr_lookup_addr(kt, &ad, 1);
378 if (flags & PFR_FLAG_FEEDBACK) {
379 if (p == NULL)
380 ad.pfra_fback = PFR_FB_NONE;
381 else if (p->pfrke_not != ad.pfra_not)
382 ad.pfra_fback = PFR_FB_CONFLICT;
383 else if (p->pfrke_mark)
384 ad.pfra_fback = PFR_FB_DUPLICATE;
385 else
386 ad.pfra_fback = PFR_FB_DELETED;
387 }
388 if (p != NULL && p->pfrke_not == ad.pfra_not &&
389 !p->pfrke_mark) {
390 p->pfrke_mark = 1;
391 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
392 xdel++;
393 }
394#if defined(__FreeBSD__)
395 if (flags & PFR_FLAG_FEEDBACK) {
396 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
397 if (ec)
398 senderr(EFAULT);
399 }
400#else
340 if (flags & PFR_FLAG_FEEDBACK)
341 if (copyout(&ad, addr+i, sizeof(ad)))
342 senderr(EFAULT);
401 if (flags & PFR_FLAG_FEEDBACK)
402 if (copyout(&ad, addr+i, sizeof(ad)))
403 senderr(EFAULT);
404#endif
343 }
344 if (!(flags & PFR_FLAG_DUMMY)) {
345 if (flags & PFR_FLAG_ATOMIC)
346 s = splsoftnet();
347 pfr_remove_kentries(kt, &workq);
348 if (flags & PFR_FLAG_ATOMIC)
349 splx(s);
350 }

--- 10 unchanged lines hidden (view full) ---

361pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
362 int *size2, int *nadd, int *ndel, int *nchange, int flags)
363{
364 struct pfr_ktable *kt, *tmpkt;
365 struct pfr_kentryworkq addq, delq, changeq;
366 struct pfr_kentry *p, *q;
367 struct pfr_addr ad;
368 int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
405 }
406 if (!(flags & PFR_FLAG_DUMMY)) {
407 if (flags & PFR_FLAG_ATOMIC)
408 s = splsoftnet();
409 pfr_remove_kentries(kt, &workq);
410 if (flags & PFR_FLAG_ATOMIC)
411 splx(s);
412 }

--- 10 unchanged lines hidden (view full) ---

423pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
424 int *size2, int *nadd, int *ndel, int *nchange, int flags)
425{
426 struct pfr_ktable *kt, *tmpkt;
427 struct pfr_kentryworkq addq, delq, changeq;
428 struct pfr_kentry *p, *q;
429 struct pfr_addr ad;
430 int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
431#if defined(__FreeBSD__)
432 int ec;
433 /*
434 * XXX Is it OK under LP64 environments?
435 */
436 long tzero = (long)time_second;
437#else
369 long tzero = time.tv_sec;
438 long tzero = time.tv_sec;
439#endif
370
371 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
372 if (pfr_validate_table(tbl, 0))
373 return (EINVAL);
374 kt = pfr_lookup_table(tbl);
375 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
376 return (ESRCH);
377 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
378 return (EPERM);
379 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
380 if (tmpkt == NULL)
381 return (ENOMEM);
382 pfr_mark_addrs(kt);
383 SLIST_INIT(&addq);
384 SLIST_INIT(&delq);
385 SLIST_INIT(&changeq);
386 for (i = 0; i < size; i++) {
440
441 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
442 if (pfr_validate_table(tbl, 0))
443 return (EINVAL);
444 kt = pfr_lookup_table(tbl);
445 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
446 return (ESRCH);
447 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
448 return (EPERM);
449 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
450 if (tmpkt == NULL)
451 return (ENOMEM);
452 pfr_mark_addrs(kt);
453 SLIST_INIT(&addq);
454 SLIST_INIT(&delq);
455 SLIST_INIT(&changeq);
456 for (i = 0; i < size; i++) {
457#if defined(__FreeBSD__)
458 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
459 if (ec)
460 senderr(EFAULT);
461#else
387 if (copyin(addr+i, &ad, sizeof(ad)))
388 senderr(EFAULT);
462 if (copyin(addr+i, &ad, sizeof(ad)))
463 senderr(EFAULT);
464#endif
389 if (pfr_validate_addr(&ad))
390 senderr(EINVAL);
391 ad.pfra_fback = PFR_FB_NONE;
392 p = pfr_lookup_addr(kt, &ad, 1);
393 if (p != NULL) {
394 if (p->pfrke_mark) {
395 ad.pfra_fback = PFR_FB_DUPLICATE;
396 goto _skip;

--- 18 unchanged lines hidden (view full) ---

415 ad.pfra_fback = PFR_FB_NONE;
416 } else {
417 SLIST_INSERT_HEAD(&addq, p, pfrke_workq);
418 ad.pfra_fback = PFR_FB_ADDED;
419 xadd++;
420 }
421 }
422_skip:
465 if (pfr_validate_addr(&ad))
466 senderr(EINVAL);
467 ad.pfra_fback = PFR_FB_NONE;
468 p = pfr_lookup_addr(kt, &ad, 1);
469 if (p != NULL) {
470 if (p->pfrke_mark) {
471 ad.pfra_fback = PFR_FB_DUPLICATE;
472 goto _skip;

--- 18 unchanged lines hidden (view full) ---

491 ad.pfra_fback = PFR_FB_NONE;
492 } else {
493 SLIST_INSERT_HEAD(&addq, p, pfrke_workq);
494 ad.pfra_fback = PFR_FB_ADDED;
495 xadd++;
496 }
497 }
498_skip:
499#if defined(__FreeBSD__)
500 if (flags & PFR_FLAG_FEEDBACK) {
501 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
502 if (ec)
503 senderr(EFAULT);
504 }
505#else
423 if (flags & PFR_FLAG_FEEDBACK)
424 if (copyout(&ad, addr+i, sizeof(ad)))
425 senderr(EFAULT);
506 if (flags & PFR_FLAG_FEEDBACK)
507 if (copyout(&ad, addr+i, sizeof(ad)))
508 senderr(EFAULT);
509#endif
426 }
427 pfr_enqueue_addrs(kt, &delq, &xdel, ENQUEUE_UNMARKED_ONLY);
428 if ((flags & PFR_FLAG_FEEDBACK) && *size2) {
429 if (*size2 < size+xdel) {
430 *size2 = size+xdel;
431 senderr(0);
432 }
433 i = 0;
434 SLIST_FOREACH(p, &delq, pfrke_workq) {
435 pfr_copyout_addr(&ad, p);
436 ad.pfra_fback = PFR_FB_DELETED;
510 }
511 pfr_enqueue_addrs(kt, &delq, &xdel, ENQUEUE_UNMARKED_ONLY);
512 if ((flags & PFR_FLAG_FEEDBACK) && *size2) {
513 if (*size2 < size+xdel) {
514 *size2 = size+xdel;
515 senderr(0);
516 }
517 i = 0;
518 SLIST_FOREACH(p, &delq, pfrke_workq) {
519 pfr_copyout_addr(&ad, p);
520 ad.pfra_fback = PFR_FB_DELETED;
521#if defined(__FreeBSD__)
522 PF_COPYOUT(&ad, addr+size+i, sizeof(ad), ec);
523 if (ec)
524 senderr(EFAULT);
525#else
437 if (copyout(&ad, addr+size+i, sizeof(ad)))
438 senderr(EFAULT);
526 if (copyout(&ad, addr+size+i, sizeof(ad)))
527 senderr(EFAULT);
528#endif
439 i++;
440 }
441 }
442 pfr_clean_node_mask(tmpkt, &addq);
443 if (!(flags & PFR_FLAG_DUMMY)) {
444 if (flags & PFR_FLAG_ATOMIC)
445 s = splsoftnet();
446 pfr_insert_kentries(kt, &addq, tzero);

--- 25 unchanged lines hidden (view full) ---

472int
473pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
474 int *nmatch, int flags)
475{
476 struct pfr_ktable *kt;
477 struct pfr_kentry *p;
478 struct pfr_addr ad;
479 int i, xmatch = 0;
529 i++;
530 }
531 }
532 pfr_clean_node_mask(tmpkt, &addq);
533 if (!(flags & PFR_FLAG_DUMMY)) {
534 if (flags & PFR_FLAG_ATOMIC)
535 s = splsoftnet();
536 pfr_insert_kentries(kt, &addq, tzero);

--- 25 unchanged lines hidden (view full) ---

562int
563pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
564 int *nmatch, int flags)
565{
566 struct pfr_ktable *kt;
567 struct pfr_kentry *p;
568 struct pfr_addr ad;
569 int i, xmatch = 0;
570#if defined(__FreeBSD__)
571 int ec;
572#endif
480
481 ACCEPT_FLAGS(PFR_FLAG_REPLACE);
482 if (pfr_validate_table(tbl, 0))
483 return (EINVAL);
484 kt = pfr_lookup_table(tbl);
485 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
486 return (ESRCH);
487
488 for (i = 0; i < size; i++) {
573
574 ACCEPT_FLAGS(PFR_FLAG_REPLACE);
575 if (pfr_validate_table(tbl, 0))
576 return (EINVAL);
577 kt = pfr_lookup_table(tbl);
578 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
579 return (ESRCH);
580
581 for (i = 0; i < size; i++) {
582#if defined(__FreeBSD__)
583 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
584 if (ec)
585 return (EFAULT);
586#else
489 if (copyin(addr+i, &ad, sizeof(ad)))
490 return (EFAULT);
587 if (copyin(addr+i, &ad, sizeof(ad)))
588 return (EFAULT);
589#endif
491 if (pfr_validate_addr(&ad))
492 return (EINVAL);
493 if (ADDR_NETWORK(&ad))
494 return (EINVAL);
495 p = pfr_lookup_addr(kt, &ad, 0);
496 if (flags & PFR_FLAG_REPLACE)
497 pfr_copyout_addr(&ad, p);
498 ad.pfra_fback = (p == NULL) ? PFR_FB_NONE :
499 (p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH);
500 if (p != NULL && !p->pfrke_not)
501 xmatch++;
590 if (pfr_validate_addr(&ad))
591 return (EINVAL);
592 if (ADDR_NETWORK(&ad))
593 return (EINVAL);
594 p = pfr_lookup_addr(kt, &ad, 0);
595 if (flags & PFR_FLAG_REPLACE)
596 pfr_copyout_addr(&ad, p);
597 ad.pfra_fback = (p == NULL) ? PFR_FB_NONE :
598 (p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH);
599 if (p != NULL && !p->pfrke_not)
600 xmatch++;
601#if defined(__FreeBSD__)
602 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
603 if (ec)
604 return (EFAULT);
605#else
502 if (copyout(&ad, addr+i, sizeof(ad)))
503 return (EFAULT);
606 if (copyout(&ad, addr+i, sizeof(ad)))
607 return (EFAULT);
608#endif
504 }
505 if (nmatch != NULL)
506 *nmatch = xmatch;
507 return (0);
508}
509
510int
511pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,

--- 13 unchanged lines hidden (view full) ---

525 *size = kt->pfrkt_cnt;
526 return (0);
527 }
528
529 bzero(&w, sizeof(w));
530 w.pfrw_op = PFRW_GET_ADDRS;
531 w.pfrw_addr = addr;
532 w.pfrw_free = kt->pfrkt_cnt;
609 }
610 if (nmatch != NULL)
611 *nmatch = xmatch;
612 return (0);
613}
614
615int
616pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,

--- 13 unchanged lines hidden (view full) ---

630 *size = kt->pfrkt_cnt;
631 return (0);
632 }
633
634 bzero(&w, sizeof(w));
635 w.pfrw_op = PFRW_GET_ADDRS;
636 w.pfrw_addr = addr;
637 w.pfrw_free = kt->pfrkt_cnt;
638#if defined(__FreeBSD__)
639 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
640#else
533 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
641 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
642#endif
534 if (!rv)
643 if (!rv)
644#if defined(__FreeBSD__)
645 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
646 &w);
647#else
535 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
648 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
649#endif
536 if (rv)
537 return (rv);
538
539 if (w.pfrw_free) {
540 printf("pfr_get_addrs: corruption detected (%d).\n",
541 w.pfrw_free);
542 return (ENOTTY);
543 }

--- 4 unchanged lines hidden (view full) ---

548int
549pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
550 int flags)
551{
552 struct pfr_ktable *kt;
553 struct pfr_walktree w;
554 struct pfr_kentryworkq workq;
555 int rv, s;
650 if (rv)
651 return (rv);
652
653 if (w.pfrw_free) {
654 printf("pfr_get_addrs: corruption detected (%d).\n",
655 w.pfrw_free);
656 return (ENOTTY);
657 }

--- 4 unchanged lines hidden (view full) ---

662int
663pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
664 int flags)
665{
666 struct pfr_ktable *kt;
667 struct pfr_walktree w;
668 struct pfr_kentryworkq workq;
669 int rv, s;
670#if defined(__FreeBSD__)
671 /*
672 * XXX Is it OK under LP64 environments?
673 */
674 long tzero = (long)time_second;
675#else
556 long tzero = time.tv_sec;
676 long tzero = time.tv_sec;
677#endif
557
558 ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
559 if (pfr_validate_table(tbl, 0))
560 return (EINVAL);
561 kt = pfr_lookup_table(tbl);
562 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
563 return (ESRCH);
564 if (kt->pfrkt_cnt > *size) {
565 *size = kt->pfrkt_cnt;
566 return (0);
567 }
568
569 bzero(&w, sizeof(w));
570 w.pfrw_op = PFRW_GET_ASTATS;
571 w.pfrw_astats = addr;
572 w.pfrw_free = kt->pfrkt_cnt;
573 if (flags & PFR_FLAG_ATOMIC)
574 s = splsoftnet();
678
679 ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
680 if (pfr_validate_table(tbl, 0))
681 return (EINVAL);
682 kt = pfr_lookup_table(tbl);
683 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
684 return (ESRCH);
685 if (kt->pfrkt_cnt > *size) {
686 *size = kt->pfrkt_cnt;
687 return (0);
688 }
689
690 bzero(&w, sizeof(w));
691 w.pfrw_op = PFRW_GET_ASTATS;
692 w.pfrw_astats = addr;
693 w.pfrw_free = kt->pfrkt_cnt;
694 if (flags & PFR_FLAG_ATOMIC)
695 s = splsoftnet();
696#if defined(__FreeBSD__)
697 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
698#else
575 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
699 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
700#endif
576 if (!rv)
701 if (!rv)
702#if defined(__FreeBSD__)
703 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
704 &w);
705#else
577 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
706 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
707#endif
578 if (!rv && (flags & PFR_FLAG_CLSTATS)) {
579 pfr_enqueue_addrs(kt, &workq, NULL, 0);
580 pfr_clstats_kentries(&workq, tzero, 0);
581 }
582 if (flags & PFR_FLAG_ATOMIC)
583 splx(s);
584 if (rv)
585 return (rv);

--- 11 unchanged lines hidden (view full) ---

597pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
598 int *nzero, int flags)
599{
600 struct pfr_ktable *kt;
601 struct pfr_kentryworkq workq;
602 struct pfr_kentry *p;
603 struct pfr_addr ad;
604 int i, rv, s, xzero = 0;
708 if (!rv && (flags & PFR_FLAG_CLSTATS)) {
709 pfr_enqueue_addrs(kt, &workq, NULL, 0);
710 pfr_clstats_kentries(&workq, tzero, 0);
711 }
712 if (flags & PFR_FLAG_ATOMIC)
713 splx(s);
714 if (rv)
715 return (rv);

--- 11 unchanged lines hidden (view full) ---

727pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
728 int *nzero, int flags)
729{
730 struct pfr_ktable *kt;
731 struct pfr_kentryworkq workq;
732 struct pfr_kentry *p;
733 struct pfr_addr ad;
734 int i, rv, s, xzero = 0;
735#if defined(__FreeBSD__)
736 int ec;
737#endif
605
606 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
607 if (pfr_validate_table(tbl, 0))
608 return (EINVAL);
609 kt = pfr_lookup_table(tbl);
610 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
611 return (ESRCH);
612 SLIST_INIT(&workq);
613 for (i = 0; i < size; i++) {
738
739 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
740 if (pfr_validate_table(tbl, 0))
741 return (EINVAL);
742 kt = pfr_lookup_table(tbl);
743 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
744 return (ESRCH);
745 SLIST_INIT(&workq);
746 for (i = 0; i < size; i++) {
747#if defined(__FreeBSD__)
748 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
749 if (ec)
750 senderr(EFAULT);
751#else
614 if (copyin(addr+i, &ad, sizeof(ad)))
615 senderr(EFAULT);
752 if (copyin(addr+i, &ad, sizeof(ad)))
753 senderr(EFAULT);
754#endif
616 if (pfr_validate_addr(&ad))
617 senderr(EINVAL);
618 p = pfr_lookup_addr(kt, &ad, 1);
619 if (flags & PFR_FLAG_FEEDBACK) {
620 ad.pfra_fback = (p != NULL) ?
621 PFR_FB_CLEARED : PFR_FB_NONE;
755 if (pfr_validate_addr(&ad))
756 senderr(EINVAL);
757 p = pfr_lookup_addr(kt, &ad, 1);
758 if (flags & PFR_FLAG_FEEDBACK) {
759 ad.pfra_fback = (p != NULL) ?
760 PFR_FB_CLEARED : PFR_FB_NONE;
761#if defined(__FreeBSD__)
762 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
763 if (ec)
764 senderr(EFAULT);
765#else
622 if (copyout(&ad, addr+i, sizeof(ad)))
623 senderr(EFAULT);
766 if (copyout(&ad, addr+i, sizeof(ad)))
767 senderr(EFAULT);
768#endif
624 }
625 if (p != NULL) {
626 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
627 xzero++;
628 }
629 }
630
631 if (!(flags & PFR_FLAG_DUMMY)) {

--- 48 unchanged lines hidden (view full) ---

680{
681 struct pfr_walktree w;
682
683 SLIST_INIT(workq);
684 bzero(&w, sizeof(w));
685 w.pfrw_op = sweep ? PFRW_SWEEP : PFRW_ENQUEUE;
686 w.pfrw_workq = workq;
687 if (kt->pfrkt_ip4 != NULL)
769 }
770 if (p != NULL) {
771 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
772 xzero++;
773 }
774 }
775
776 if (!(flags & PFR_FLAG_DUMMY)) {

--- 48 unchanged lines hidden (view full) ---

825{
826 struct pfr_walktree w;
827
828 SLIST_INIT(workq);
829 bzero(&w, sizeof(w));
830 w.pfrw_op = sweep ? PFRW_SWEEP : PFRW_ENQUEUE;
831 w.pfrw_workq = workq;
832 if (kt->pfrkt_ip4 != NULL)
833#if defined(__FreeBSD__)
834 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree,
835 &w))
836#else
688 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
837 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
838#endif
689 printf("pfr_enqueue_addrs: IPv4 walktree failed.\n");
690 if (kt->pfrkt_ip6 != NULL)
839 printf("pfr_enqueue_addrs: IPv4 walktree failed.\n");
840 if (kt->pfrkt_ip6 != NULL)
841#if defined(__FreeBSD__)
842 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
843 &w))
844#else
691 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
845 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
846#endif
692 printf("pfr_enqueue_addrs: IPv6 walktree failed.\n");
693 if (naddr != NULL)
694 *naddr = w.pfrw_cnt;
695}
696
697void
698pfr_mark_addrs(struct pfr_ktable *kt)
699{
700 struct pfr_walktree w;
701
702 bzero(&w, sizeof(w));
703 w.pfrw_op = PFRW_MARK;
847 printf("pfr_enqueue_addrs: IPv6 walktree failed.\n");
848 if (naddr != NULL)
849 *naddr = w.pfrw_cnt;
850}
851
852void
853pfr_mark_addrs(struct pfr_ktable *kt)
854{
855 struct pfr_walktree w;
856
857 bzero(&w, sizeof(w));
858 w.pfrw_op = PFRW_MARK;
859#if defined(__FreeBSD__)
860 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
861#else
704 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
862 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
863#endif
705 printf("pfr_mark_addrs: IPv4 walktree failed.\n");
864 printf("pfr_mark_addrs: IPv4 walktree failed.\n");
865#if defined(__FreeBSD__)
866 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
867#else
706 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
868 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
869#endif
707 printf("pfr_mark_addrs: IPv6 walktree failed.\n");
708}
709
710
711struct pfr_kentry *
712pfr_lookup_addr(struct pfr_ktable *kt, struct pfr_addr *ad, int exact)
713{
714 union sockaddr_union sa, mask;

--- 7 unchanged lines hidden (view full) ---

722 head = kt->pfrkt_ip4;
723 } else {
724 FILLIN_SIN6(sa.sin6, ad->pfra_ip6addr);
725 head = kt->pfrkt_ip6;
726 }
727 if (ADDR_NETWORK(ad)) {
728 pfr_prepare_network(&mask, ad->pfra_af, ad->pfra_net);
729 s = splsoftnet(); /* rn_lookup makes use of globals */
870 printf("pfr_mark_addrs: IPv6 walktree failed.\n");
871}
872
873
874struct pfr_kentry *
875pfr_lookup_addr(struct pfr_ktable *kt, struct pfr_addr *ad, int exact)
876{
877 union sockaddr_union sa, mask;

--- 7 unchanged lines hidden (view full) ---

885 head = kt->pfrkt_ip4;
886 } else {
887 FILLIN_SIN6(sa.sin6, ad->pfra_ip6addr);
888 head = kt->pfrkt_ip6;
889 }
890 if (ADDR_NETWORK(ad)) {
891 pfr_prepare_network(&mask, ad->pfra_af, ad->pfra_net);
892 s = splsoftnet(); /* rn_lookup makes use of globals */
893#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
894 RADIX_NODE_HEAD_LOCK(head);
895#endif
730 ke = (struct pfr_kentry *)rn_lookup(&sa, &mask, head);
896 ke = (struct pfr_kentry *)rn_lookup(&sa, &mask, head);
897#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
898 RADIX_NODE_HEAD_UNLOCK(head);
899#endif
731 splx(s);
732 if (ke && KENTRY_RNF_ROOT(ke))
733 ke = NULL;
734 } else {
735 ke = (struct pfr_kentry *)rn_match(&sa, head);
736 if (ke && KENTRY_RNF_ROOT(ke))
737 ke = NULL;
738 if (exact && ke && KENTRY_NETWORK(ke))

--- 101 unchanged lines hidden (view full) ---

840 }
841}
842
843void
844pfr_reset_feedback(struct pfr_addr *addr, int size)
845{
846 struct pfr_addr ad;
847 int i;
900 splx(s);
901 if (ke && KENTRY_RNF_ROOT(ke))
902 ke = NULL;
903 } else {
904 ke = (struct pfr_kentry *)rn_match(&sa, head);
905 if (ke && KENTRY_RNF_ROOT(ke))
906 ke = NULL;
907 if (exact && ke && KENTRY_NETWORK(ke))

--- 101 unchanged lines hidden (view full) ---

1009 }
1010}
1011
1012void
1013pfr_reset_feedback(struct pfr_addr *addr, int size)
1014{
1015 struct pfr_addr ad;
1016 int i;
1017#if defined(__FreeBSD__)
1018 int ec;
1019#endif
848
849 for (i = 0; i < size; i++) {
1020
1021 for (i = 0; i < size; i++) {
1022#if defined(__FreeBSD__)
1023 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
1024 if (ec)
1025 break;
1026#else
850 if (copyin(addr+i, &ad, sizeof(ad)))
851 break;
1027 if (copyin(addr+i, &ad, sizeof(ad)))
1028 break;
1029#endif
852 ad.pfra_fback = PFR_FB_NONE;
1030 ad.pfra_fback = PFR_FB_NONE;
1031#if defined(__FreeBSD__)
1032 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
1033 if (ec)
1034 break;
1035#else
853 if (copyout(&ad, addr+i, sizeof(ad)))
854 break;
1036 if (copyout(&ad, addr+i, sizeof(ad)))
1037 break;
1038#endif
855 }
856}
857
858void
859pfr_prepare_network(union sockaddr_union *sa, int af, int net)
860{
861 int i;
862

--- 27 unchanged lines hidden (view full) ---

890
891 bzero(ke->pfrke_node, sizeof(ke->pfrke_node));
892 if (ke->pfrke_af == AF_INET)
893 head = kt->pfrkt_ip4;
894 else
895 head = kt->pfrkt_ip6;
896
897 s = splsoftnet();
1039 }
1040}
1041
1042void
1043pfr_prepare_network(union sockaddr_union *sa, int af, int net)
1044{
1045 int i;
1046

--- 27 unchanged lines hidden (view full) ---

1074
1075 bzero(ke->pfrke_node, sizeof(ke->pfrke_node));
1076 if (ke->pfrke_af == AF_INET)
1077 head = kt->pfrkt_ip4;
1078 else
1079 head = kt->pfrkt_ip6;
1080
1081 s = splsoftnet();
1082#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
1083 RADIX_NODE_HEAD_LOCK(head);
1084#endif
898 if (KENTRY_NETWORK(ke)) {
899 pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
900 rn = rn_addroute(&ke->pfrke_sa, &mask, head, ke->pfrke_node);
901 } else
902 rn = rn_addroute(&ke->pfrke_sa, NULL, head, ke->pfrke_node);
1085 if (KENTRY_NETWORK(ke)) {
1086 pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
1087 rn = rn_addroute(&ke->pfrke_sa, &mask, head, ke->pfrke_node);
1088 } else
1089 rn = rn_addroute(&ke->pfrke_sa, NULL, head, ke->pfrke_node);
1090#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
1091 RADIX_NODE_HEAD_UNLOCK(head);
1092#endif
903 splx(s);
904
905 return (rn == NULL ? -1 : 0);
906}
907
908int
909pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
910{
911 union sockaddr_union mask;
912 struct radix_node *rn;
913 struct radix_node_head *head;
914 int s;
915
916 if (ke->pfrke_af == AF_INET)
917 head = kt->pfrkt_ip4;
918 else
919 head = kt->pfrkt_ip6;
920
921 s = splsoftnet();
1093 splx(s);
1094
1095 return (rn == NULL ? -1 : 0);
1096}
1097
1098int
1099pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
1100{
1101 union sockaddr_union mask;
1102 struct radix_node *rn;
1103 struct radix_node_head *head;
1104 int s;
1105
1106 if (ke->pfrke_af == AF_INET)
1107 head = kt->pfrkt_ip4;
1108 else
1109 head = kt->pfrkt_ip6;
1110
1111 s = splsoftnet();
1112#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
1113 RADIX_NODE_HEAD_LOCK(head);
1114#endif
922 if (KENTRY_NETWORK(ke)) {
923 pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
924 rn = rn_delete(&ke->pfrke_sa, &mask, head);
925 } else
926 rn = rn_delete(&ke->pfrke_sa, NULL, head);
1115 if (KENTRY_NETWORK(ke)) {
1116 pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
1117 rn = rn_delete(&ke->pfrke_sa, &mask, head);
1118 } else
1119 rn = rn_delete(&ke->pfrke_sa, NULL, head);
1120#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
1121 RADIX_NODE_HEAD_UNLOCK(head);
1122#endif
927 splx(s);
928
929 if (rn == NULL) {
930 printf("pfr_unroute_kentry: delete failed.\n");
931 return (-1);
932 }
933 return (0);
934}

--- 14 unchanged lines hidden (view full) ---

949}
950
951int
952pfr_walktree(struct radix_node *rn, void *arg)
953{
954 struct pfr_kentry *ke = (struct pfr_kentry *)rn;
955 struct pfr_walktree *w = arg;
956 int s;
1123 splx(s);
1124
1125 if (rn == NULL) {
1126 printf("pfr_unroute_kentry: delete failed.\n");
1127 return (-1);
1128 }
1129 return (0);
1130}

--- 14 unchanged lines hidden (view full) ---

1145}
1146
1147int
1148pfr_walktree(struct radix_node *rn, void *arg)
1149{
1150 struct pfr_kentry *ke = (struct pfr_kentry *)rn;
1151 struct pfr_walktree *w = arg;
1152 int s;
1153#if defined(__FreeBSD__)
1154 int ec;
1155#endif
957
958 switch (w->pfrw_op) {
959 case PFRW_MARK:
960 ke->pfrke_mark = 0;
961 break;
962 case PFRW_SWEEP:
963 if (ke->pfrke_mark)
964 break;
965 /* fall trough */
966 case PFRW_ENQUEUE:
967 SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq);
968 w->pfrw_cnt++;
969 break;
970 case PFRW_GET_ADDRS:
971 if (w->pfrw_free-- > 0) {
972 struct pfr_addr ad;
973
974 pfr_copyout_addr(&ad, ke);
1156
1157 switch (w->pfrw_op) {
1158 case PFRW_MARK:
1159 ke->pfrke_mark = 0;
1160 break;
1161 case PFRW_SWEEP:
1162 if (ke->pfrke_mark)
1163 break;
1164 /* fall trough */
1165 case PFRW_ENQUEUE:
1166 SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq);
1167 w->pfrw_cnt++;
1168 break;
1169 case PFRW_GET_ADDRS:
1170 if (w->pfrw_free-- > 0) {
1171 struct pfr_addr ad;
1172
1173 pfr_copyout_addr(&ad, ke);
1174#if defined(__FreeBSD__)
1175 PF_COPYOUT(&ad, w->pfrw_addr, sizeof(ad), ec);
1176 if (ec)
1177 return (EFAULT);
1178#else
975 if (copyout(&ad, w->pfrw_addr, sizeof(ad)))
976 return (EFAULT);
1179 if (copyout(&ad, w->pfrw_addr, sizeof(ad)))
1180 return (EFAULT);
1181#endif
977 w->pfrw_addr++;
978 }
979 break;
980 case PFRW_GET_ASTATS:
981 if (w->pfrw_free-- > 0) {
982 struct pfr_astats as;
983
984 pfr_copyout_addr(&as.pfras_a, ke);
985
986 s = splsoftnet();
987 bcopy(ke->pfrke_packets, as.pfras_packets,
988 sizeof(as.pfras_packets));
989 bcopy(ke->pfrke_bytes, as.pfras_bytes,
990 sizeof(as.pfras_bytes));
991 splx(s);
992 as.pfras_tzero = ke->pfrke_tzero;
993
1182 w->pfrw_addr++;
1183 }
1184 break;
1185 case PFRW_GET_ASTATS:
1186 if (w->pfrw_free-- > 0) {
1187 struct pfr_astats as;
1188
1189 pfr_copyout_addr(&as.pfras_a, ke);
1190
1191 s = splsoftnet();
1192 bcopy(ke->pfrke_packets, as.pfras_packets,
1193 sizeof(as.pfras_packets));
1194 bcopy(ke->pfrke_bytes, as.pfras_bytes,
1195 sizeof(as.pfras_bytes));
1196 splx(s);
1197 as.pfras_tzero = ke->pfrke_tzero;
1198
1199#if defined(__FreeBSD__)
1200 PF_COPYOUT(&as, w->pfrw_astats, sizeof(as), ec);
1201 if (ec)
1202 return (EFAULT);
1203#else
994 if (copyout(&as, w->pfrw_astats, sizeof(as)))
995 return (EFAULT);
1204 if (copyout(&as, w->pfrw_astats, sizeof(as)))
1205 return (EFAULT);
1206#endif
996 w->pfrw_astats++;
997 }
998 break;
999 case PFRW_POOL_GET:
1000 if (ke->pfrke_not)
1001 break; /* negative entries are ignored */
1002 if (!w->pfrw_cnt--) {
1003 w->pfrw_kentry = ke;

--- 38 unchanged lines hidden (view full) ---

1042}
1043
1044int
1045pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
1046{
1047 struct pfr_ktableworkq addq, changeq;
1048 struct pfr_ktable *p, *q, *r, key;
1049 int i, rv, s, xadd = 0;
1207 w->pfrw_astats++;
1208 }
1209 break;
1210 case PFRW_POOL_GET:
1211 if (ke->pfrke_not)
1212 break; /* negative entries are ignored */
1213 if (!w->pfrw_cnt--) {
1214 w->pfrw_kentry = ke;

--- 38 unchanged lines hidden (view full) ---

1253}
1254
1255int
1256pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
1257{
1258 struct pfr_ktableworkq addq, changeq;
1259 struct pfr_ktable *p, *q, *r, key;
1260 int i, rv, s, xadd = 0;
1261#if defined(__FreeBSD__)
1262 int ec;
1263 /*
1264 * XXX Is it OK under LP64 environments?
1265 */
1266 long tzero = (long)time_second;
1267#else
1050 long tzero = time.tv_sec;
1268 long tzero = time.tv_sec;
1269#endif
1051
1052 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1053 SLIST_INIT(&addq);
1054 SLIST_INIT(&changeq);
1055 for (i = 0; i < size; i++) {
1270
1271 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1272 SLIST_INIT(&addq);
1273 SLIST_INIT(&changeq);
1274 for (i = 0; i < size; i++) {
1275#if defined(__FreeBSD__)
1276 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1277 if (ec)
1278 senderr(EFAULT);
1279#else
1056 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1057 senderr(EFAULT);
1280 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1281 senderr(EFAULT);
1282#endif
1058 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK))
1059 senderr(EINVAL);
1060 key.pfrkt_flags |= PFR_TFLAG_ACTIVE;
1061 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1062 if (p == NULL) {
1063 p = pfr_create_ktable(&key.pfrkt_t, tzero, 1);
1064 if (p == NULL)
1065 senderr(ENOMEM);

--- 56 unchanged lines hidden (view full) ---

1122}
1123
1124int
1125pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
1126{
1127 struct pfr_ktableworkq workq;
1128 struct pfr_ktable *p, *q, key;
1129 int i, s, xdel = 0;
1283 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK))
1284 senderr(EINVAL);
1285 key.pfrkt_flags |= PFR_TFLAG_ACTIVE;
1286 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1287 if (p == NULL) {
1288 p = pfr_create_ktable(&key.pfrkt_t, tzero, 1);
1289 if (p == NULL)
1290 senderr(ENOMEM);

--- 56 unchanged lines hidden (view full) ---

1347}
1348
1349int
1350pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
1351{
1352 struct pfr_ktableworkq workq;
1353 struct pfr_ktable *p, *q, key;
1354 int i, s, xdel = 0;
1355#if defined(__FreeBSD__)
1356 int ec;
1357#endif
1130
1131 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1132 SLIST_INIT(&workq);
1133 for (i = 0; i < size; i++) {
1358
1359 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1360 SLIST_INIT(&workq);
1361 for (i = 0; i < size; i++) {
1362#if defined(__FreeBSD__)
1363 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1364 if (ec)
1365 return (EFAULT);
1366#else
1134 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1135 return (EFAULT);
1367 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1368 return (EFAULT);
1369#endif
1136 if (pfr_validate_table(&key.pfrkt_t, 0))
1137 return (EINVAL);
1138 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1139 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1140 SLIST_FOREACH(q, &workq, pfrkt_workq)
1141 if (!pfr_ktable_compare(p, q))
1142 goto _skip;
1143 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;

--- 17 unchanged lines hidden (view full) ---

1161}
1162
1163int
1164pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
1165 int flags)
1166{
1167 struct pfr_ktable *p;
1168 int n, nn;
1370 if (pfr_validate_table(&key.pfrkt_t, 0))
1371 return (EINVAL);
1372 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1373 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1374 SLIST_FOREACH(q, &workq, pfrkt_workq)
1375 if (!pfr_ktable_compare(p, q))
1376 goto _skip;
1377 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;

--- 17 unchanged lines hidden (view full) ---

1395}
1396
1397int
1398pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
1399 int flags)
1400{
1401 struct pfr_ktable *p;
1402 int n, nn;
1403#if defined(__FreeBSD__)
1404 int ec;
1405#endif
1169
1170 ACCEPT_FLAGS(PFR_FLAG_ALLRSETS);
1171 n = nn = pfr_table_count(filter, flags);
1172 if (n < 0)
1173 return (ENOENT);
1174 if (n > *size) {
1175 *size = n;
1176 return (0);
1177 }
1178 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1179 if (pfr_skip_table(filter, p, flags))
1180 continue;
1181 if (n-- <= 0)
1182 continue;
1406
1407 ACCEPT_FLAGS(PFR_FLAG_ALLRSETS);
1408 n = nn = pfr_table_count(filter, flags);
1409 if (n < 0)
1410 return (ENOENT);
1411 if (n > *size) {
1412 *size = n;
1413 return (0);
1414 }
1415 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1416 if (pfr_skip_table(filter, p, flags))
1417 continue;
1418 if (n-- <= 0)
1419 continue;
1420#if defined(__FreeBSD__)
1421 PF_COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl), ec);
1422 if (ec)
1423 return (EFAULT);
1424#else
1183 if (copyout(&p->pfrkt_t, tbl++, sizeof(*tbl)))
1184 return (EFAULT);
1425 if (copyout(&p->pfrkt_t, tbl++, sizeof(*tbl)))
1426 return (EFAULT);
1427#endif
1185 }
1186 if (n) {
1187 printf("pfr_get_tables: corruption detected (%d).\n", n);
1188 return (ENOTTY);
1189 }
1190 *size = nn;
1191 return (0);
1192}
1193
1194int
1195pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
1196 int flags)
1197{
1198 struct pfr_ktable *p;
1199 struct pfr_ktableworkq workq;
1200 int s, n, nn;
1428 }
1429 if (n) {
1430 printf("pfr_get_tables: corruption detected (%d).\n", n);
1431 return (ENOTTY);
1432 }
1433 *size = nn;
1434 return (0);
1435}
1436
1437int
1438pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
1439 int flags)
1440{
1441 struct pfr_ktable *p;
1442 struct pfr_ktableworkq workq;
1443 int s, n, nn;
1444#if defined(__FreeBSD__)
1445 int ec;
1446 /*
1447 * XXX Is it OK under LP64 environments?
1448 */
1449 long tzero = (long)time_second;
1450#else
1201 long tzero = time.tv_sec;
1451 long tzero = time.tv_sec;
1452#endif
1202
1203 ACCEPT_FLAGS(PFR_FLAG_ATOMIC|PFR_FLAG_ALLRSETS);
1204 /* XXX PFR_FLAG_CLSTATS disabled */
1205 n = nn = pfr_table_count(filter, flags);
1206 if (n < 0)
1207 return (ENOENT);
1208 if (n > *size) {
1209 *size = n;

--- 4 unchanged lines hidden (view full) ---

1214 s = splsoftnet();
1215 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1216 if (pfr_skip_table(filter, p, flags))
1217 continue;
1218 if (n-- <= 0)
1219 continue;
1220 if (!(flags & PFR_FLAG_ATOMIC))
1221 s = splsoftnet();
1453
1454 ACCEPT_FLAGS(PFR_FLAG_ATOMIC|PFR_FLAG_ALLRSETS);
1455 /* XXX PFR_FLAG_CLSTATS disabled */
1456 n = nn = pfr_table_count(filter, flags);
1457 if (n < 0)
1458 return (ENOENT);
1459 if (n > *size) {
1460 *size = n;

--- 4 unchanged lines hidden (view full) ---

1465 s = splsoftnet();
1466 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1467 if (pfr_skip_table(filter, p, flags))
1468 continue;
1469 if (n-- <= 0)
1470 continue;
1471 if (!(flags & PFR_FLAG_ATOMIC))
1472 s = splsoftnet();
1473#if defined(__FreeBSD__)
1474 PF_COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl), ec);
1475 if (ec) {
1476 splx(s);
1477 return (EFAULT);
1478 }
1479#else
1222 if (copyout(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
1223 splx(s);
1224 return (EFAULT);
1225 }
1480 if (copyout(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
1481 splx(s);
1482 return (EFAULT);
1483 }
1484#endif
1226 if (!(flags & PFR_FLAG_ATOMIC))
1227 splx(s);
1228 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1229 }
1230 if (flags & PFR_FLAG_CLSTATS)
1231 pfr_clstats_ktables(&workq, tzero,
1232 flags & PFR_FLAG_ADDRSTOO);
1233 if (flags & PFR_FLAG_ATOMIC)

--- 7 unchanged lines hidden (view full) ---

1241}
1242
1243int
1244pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
1245{
1246 struct pfr_ktableworkq workq;
1247 struct pfr_ktable *p, key;
1248 int i, s, xzero = 0;
1485 if (!(flags & PFR_FLAG_ATOMIC))
1486 splx(s);
1487 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1488 }
1489 if (flags & PFR_FLAG_CLSTATS)
1490 pfr_clstats_ktables(&workq, tzero,
1491 flags & PFR_FLAG_ADDRSTOO);
1492 if (flags & PFR_FLAG_ATOMIC)

--- 7 unchanged lines hidden (view full) ---

1500}
1501
1502int
1503pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
1504{
1505 struct pfr_ktableworkq workq;
1506 struct pfr_ktable *p, key;
1507 int i, s, xzero = 0;
1508#if defined(__FreeBSD__)
1509 int ec;
1510 /*
1511 * XXX Is it OK under LP64 environments?
1512 */
1513 long tzero = (long)time_second;
1514#else
1249 long tzero = time.tv_sec;
1515 long tzero = time.tv_sec;
1516#endif
1250
1251 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
1252 SLIST_INIT(&workq);
1253 for (i = 0; i < size; i++) {
1517
1518 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
1519 SLIST_INIT(&workq);
1520 for (i = 0; i < size; i++) {
1521#if defined(__FreeBSD__)
1522 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1523 if (ec)
1524 return (EFAULT);
1525#else
1254 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1255 return (EFAULT);
1526 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1527 return (EFAULT);
1528#endif
1256 if (pfr_validate_table(&key.pfrkt_t, 0))
1257 return (EINVAL);
1258 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1259 if (p != NULL) {
1260 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1261 xzero++;
1262 }
1263 }

--- 11 unchanged lines hidden (view full) ---

1275
1276int
1277pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
1278 int *nchange, int *ndel, int flags)
1279{
1280 struct pfr_ktableworkq workq;
1281 struct pfr_ktable *p, *q, key;
1282 int i, s, xchange = 0, xdel = 0;
1529 if (pfr_validate_table(&key.pfrkt_t, 0))
1530 return (EINVAL);
1531 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1532 if (p != NULL) {
1533 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1534 xzero++;
1535 }
1536 }

--- 11 unchanged lines hidden (view full) ---

1548
1549int
1550pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
1551 int *nchange, int *ndel, int flags)
1552{
1553 struct pfr_ktableworkq workq;
1554 struct pfr_ktable *p, *q, key;
1555 int i, s, xchange = 0, xdel = 0;
1556#if defined(__FreeBSD__)
1557 int ec;
1558#endif
1283
1284 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1285 if ((setflag & ~PFR_TFLAG_USRMASK) ||
1286 (clrflag & ~PFR_TFLAG_USRMASK) ||
1287 (setflag & clrflag))
1288 return (EINVAL);
1289 SLIST_INIT(&workq);
1290 for (i = 0; i < size; i++) {
1559
1560 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1561 if ((setflag & ~PFR_TFLAG_USRMASK) ||
1562 (clrflag & ~PFR_TFLAG_USRMASK) ||
1563 (setflag & clrflag))
1564 return (EINVAL);
1565 SLIST_INIT(&workq);
1566 for (i = 0; i < size; i++) {
1567#if defined(__FreeBSD__)
1568 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1569 if (ec)
1570 return (EFAULT);
1571#else
1291 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1292 return (EFAULT);
1572 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1573 return (EFAULT);
1574#endif
1293 if (pfr_validate_table(&key.pfrkt_t, 0))
1294 return (EINVAL);
1295 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1296 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1297 p->pfrkt_nflags = (p->pfrkt_flags | setflag) &
1298 ~clrflag;
1299 if (p->pfrkt_nflags == p->pfrkt_flags)
1300 goto _skip;

--- 64 unchanged lines hidden (view full) ---

1365{
1366 struct pfr_ktableworkq tableq;
1367 struct pfr_kentryworkq addrq;
1368 struct pfr_ktable *kt, *rt, *shadow, key;
1369 struct pfr_kentry *p;
1370 struct pfr_addr ad;
1371 struct pf_ruleset *rs;
1372 int i, rv, xadd = 0, xaddr = 0;
1575 if (pfr_validate_table(&key.pfrkt_t, 0))
1576 return (EINVAL);
1577 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1578 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1579 p->pfrkt_nflags = (p->pfrkt_flags | setflag) &
1580 ~clrflag;
1581 if (p->pfrkt_nflags == p->pfrkt_flags)
1582 goto _skip;

--- 64 unchanged lines hidden (view full) ---

1647{
1648 struct pfr_ktableworkq tableq;
1649 struct pfr_kentryworkq addrq;
1650 struct pfr_ktable *kt, *rt, *shadow, key;
1651 struct pfr_kentry *p;
1652 struct pfr_addr ad;
1653 struct pf_ruleset *rs;
1654 int i, rv, xadd = 0, xaddr = 0;
1655#if defined(__FreeBSD__)
1656 int ec;
1657#endif
1373
1374 ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO);
1375 if (size && !(flags & PFR_FLAG_ADDRSTOO))
1376 return (EINVAL);
1377 if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK))
1378 return (EINVAL);
1379 rs = pf_find_ruleset(tbl->pfrt_anchor, tbl->pfrt_ruleset);
1380 if (rs == NULL || !rs->topen || ticket != rs->tticket)

--- 30 unchanged lines hidden (view full) ---

1411_skip:
1412 shadow = pfr_create_ktable(tbl, 0, 0);
1413 if (shadow == NULL) {
1414 pfr_destroy_ktables(&tableq, 0);
1415 return (ENOMEM);
1416 }
1417 SLIST_INIT(&addrq);
1418 for (i = 0; i < size; i++) {
1658
1659 ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO);
1660 if (size && !(flags & PFR_FLAG_ADDRSTOO))
1661 return (EINVAL);
1662 if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK))
1663 return (EINVAL);
1664 rs = pf_find_ruleset(tbl->pfrt_anchor, tbl->pfrt_ruleset);
1665 if (rs == NULL || !rs->topen || ticket != rs->tticket)

--- 30 unchanged lines hidden (view full) ---

1696_skip:
1697 shadow = pfr_create_ktable(tbl, 0, 0);
1698 if (shadow == NULL) {
1699 pfr_destroy_ktables(&tableq, 0);
1700 return (ENOMEM);
1701 }
1702 SLIST_INIT(&addrq);
1703 for (i = 0; i < size; i++) {
1704#if defined(__FreeBSD__)
1705 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
1706 if (ec)
1707 senderr(EFAULT);
1708#else
1419 if (copyin(addr+i, &ad, sizeof(ad)))
1420 senderr(EFAULT);
1709 if (copyin(addr+i, &ad, sizeof(ad)))
1710 senderr(EFAULT);
1711#endif
1421 if (pfr_validate_addr(&ad))
1422 senderr(EINVAL);
1423 if (pfr_lookup_addr(shadow, &ad, 1) != NULL)
1424 continue;
1425 p = pfr_create_kentry(&ad);
1426 if (p == NULL)
1427 senderr(ENOMEM);
1428 if (pfr_route_kentry(shadow, p)) {

--- 32 unchanged lines hidden (view full) ---

1461int
1462pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
1463 int *nchange, int flags)
1464{
1465 struct pfr_ktable *p;
1466 struct pfr_ktableworkq workq;
1467 struct pf_ruleset *rs;
1468 int s, xadd = 0, xchange = 0;
1712 if (pfr_validate_addr(&ad))
1713 senderr(EINVAL);
1714 if (pfr_lookup_addr(shadow, &ad, 1) != NULL)
1715 continue;
1716 p = pfr_create_kentry(&ad);
1717 if (p == NULL)
1718 senderr(ENOMEM);
1719 if (pfr_route_kentry(shadow, p)) {

--- 32 unchanged lines hidden (view full) ---

1752int
1753pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
1754 int *nchange, int flags)
1755{
1756 struct pfr_ktable *p;
1757 struct pfr_ktableworkq workq;
1758 struct pf_ruleset *rs;
1759 int s, xadd = 0, xchange = 0;
1760#if defined(__FreeBSD__)
1761 /*
1762 * XXX Is it OK under LP64 environments?
1763 */
1764 long tzero = (long)time_second;
1765#else
1469 long tzero = time.tv_sec;
1766 long tzero = time.tv_sec;
1767#endif
1470
1471 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1472 rs = pf_find_ruleset(trs->pfrt_anchor, trs->pfrt_ruleset);
1473 if (rs == NULL || !rs->topen || ticket != rs->tticket)
1474 return (EBUSY);
1475
1476 SLIST_INIT(&workq);
1477 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {

--- 278 unchanged lines hidden (view full) ---

1756{
1757 struct pfr_kentryworkq addrq;
1758
1759 if (flushaddr) {
1760 pfr_enqueue_addrs(kt, &addrq, NULL, 0);
1761 pfr_clean_node_mask(kt, &addrq);
1762 pfr_destroy_kentries(&addrq);
1763 }
1768
1769 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1770 rs = pf_find_ruleset(trs->pfrt_anchor, trs->pfrt_ruleset);
1771 if (rs == NULL || !rs->topen || ticket != rs->tticket)
1772 return (EBUSY);
1773
1774 SLIST_INIT(&workq);
1775 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {

--- 278 unchanged lines hidden (view full) ---

2054{
2055 struct pfr_kentryworkq addrq;
2056
2057 if (flushaddr) {
2058 pfr_enqueue_addrs(kt, &addrq, NULL, 0);
2059 pfr_clean_node_mask(kt, &addrq);
2060 pfr_destroy_kentries(&addrq);
2061 }
2062#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
2063 if (kt->pfrkt_ip4 != NULL) {
2064 RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip4);
2065 free((caddr_t)kt->pfrkt_ip4, M_RTABLE);
2066 }
2067 if (kt->pfrkt_ip6 != NULL) {
2068 RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip6);
2069 free((caddr_t)kt->pfrkt_ip6, M_RTABLE);
2070 }
2071#else
1764 if (kt->pfrkt_ip4 != NULL)
1765 free((caddr_t)kt->pfrkt_ip4, M_RTABLE);
1766 if (kt->pfrkt_ip6 != NULL)
1767 free((caddr_t)kt->pfrkt_ip6, M_RTABLE);
2072 if (kt->pfrkt_ip4 != NULL)
2073 free((caddr_t)kt->pfrkt_ip4, M_RTABLE);
2074 if (kt->pfrkt_ip6 != NULL)
2075 free((caddr_t)kt->pfrkt_ip6, M_RTABLE);
2076#endif
1768 if (kt->pfrkt_shadow != NULL)
1769 pfr_destroy_ktable(kt->pfrkt_shadow, flushaddr);
1770 if (kt->pfrkt_rs != NULL) {
1771 kt->pfrkt_rs->tables--;
1772 if (kt->pfrkt_rs->anchor != NULL)
1773 kt->pfrkt_rs->anchor->tables--;
1774 pf_remove_if_empty_ruleset(kt->pfrkt_rs);
1775 }

--- 102 unchanged lines hidden (view full) ---

1878 bzero(&tbl, sizeof(tbl));
1879 strlcpy(tbl.pfrt_name, name, sizeof(tbl.pfrt_name));
1880 if (ac != NULL) {
1881 strlcpy(tbl.pfrt_anchor, ac->name, sizeof(tbl.pfrt_anchor));
1882 strlcpy(tbl.pfrt_ruleset, rs->name, sizeof(tbl.pfrt_ruleset));
1883 }
1884 kt = pfr_lookup_table(&tbl);
1885 if (kt == NULL) {
2077 if (kt->pfrkt_shadow != NULL)
2078 pfr_destroy_ktable(kt->pfrkt_shadow, flushaddr);
2079 if (kt->pfrkt_rs != NULL) {
2080 kt->pfrkt_rs->tables--;
2081 if (kt->pfrkt_rs->anchor != NULL)
2082 kt->pfrkt_rs->anchor->tables--;
2083 pf_remove_if_empty_ruleset(kt->pfrkt_rs);
2084 }

--- 102 unchanged lines hidden (view full) ---

2187 bzero(&tbl, sizeof(tbl));
2188 strlcpy(tbl.pfrt_name, name, sizeof(tbl.pfrt_name));
2189 if (ac != NULL) {
2190 strlcpy(tbl.pfrt_anchor, ac->name, sizeof(tbl.pfrt_anchor));
2191 strlcpy(tbl.pfrt_ruleset, rs->name, sizeof(tbl.pfrt_ruleset));
2192 }
2193 kt = pfr_lookup_table(&tbl);
2194 if (kt == NULL) {
2195#if defined(__FreeBSD__)
2196 /*
2197 * XXX Is it OK under LP64 environments?
2198 */
2199 kt = pfr_create_ktable(&tbl, (long)time_second, 1);
2200#else
1886 kt = pfr_create_ktable(&tbl, time.tv_sec, 1);
2201 kt = pfr_create_ktable(&tbl, time.tv_sec, 1);
2202#endif
1887 if (kt == NULL)
1888 return (NULL);
1889 if (ac != NULL) {
1890 bzero(tbl.pfrt_anchor, sizeof(tbl.pfrt_anchor));
1891 bzero(tbl.pfrt_ruleset, sizeof(tbl.pfrt_ruleset));
1892 rt = pfr_lookup_table(&tbl);
1893 if (rt == NULL) {
1894 rt = pfr_create_ktable(&tbl, 0, 1);

--- 17 unchanged lines hidden (view full) ---

1912{
1913 if (kt->pfrkt_refcnt[PFR_REFCNT_RULE] <= 0)
1914 printf("pfr_detach_table: refcount = %d.\n",
1915 kt->pfrkt_refcnt[PFR_REFCNT_RULE]);
1916 else if (!--kt->pfrkt_refcnt[PFR_REFCNT_RULE])
1917 pfr_setflags_ktable(kt, kt->pfrkt_flags&~PFR_TFLAG_REFERENCED);
1918}
1919
2203 if (kt == NULL)
2204 return (NULL);
2205 if (ac != NULL) {
2206 bzero(tbl.pfrt_anchor, sizeof(tbl.pfrt_anchor));
2207 bzero(tbl.pfrt_ruleset, sizeof(tbl.pfrt_ruleset));
2208 rt = pfr_lookup_table(&tbl);
2209 if (rt == NULL) {
2210 rt = pfr_create_ktable(&tbl, 0, 1);

--- 17 unchanged lines hidden (view full) ---

2228{
2229 if (kt->pfrkt_refcnt[PFR_REFCNT_RULE] <= 0)
2230 printf("pfr_detach_table: refcount = %d.\n",
2231 kt->pfrkt_refcnt[PFR_REFCNT_RULE]);
2232 else if (!--kt->pfrkt_refcnt[PFR_REFCNT_RULE])
2233 pfr_setflags_ktable(kt, kt->pfrkt_flags&~PFR_TFLAG_REFERENCED);
2234}
2235
2236
1920int
1921pfr_pool_get(struct pfr_ktable *kt, int *pidx, struct pf_addr *counter,
1922 struct pf_addr **raddr, struct pf_addr **rmask, sa_family_t af)
1923{
1924 struct pfr_kentry *ke, *ke2;
1925 struct pf_addr *addr;
1926 union sockaddr_union mask;
1927 int idx = -1, use_counter = 0;

--- 73 unchanged lines hidden (view full) ---

2001 struct pfr_walktree w;
2002
2003 bzero(&w, sizeof(w));
2004 w.pfrw_op = PFRW_POOL_GET;
2005 w.pfrw_cnt = idx;
2006
2007 switch(af) {
2008 case AF_INET:
2237int
2238pfr_pool_get(struct pfr_ktable *kt, int *pidx, struct pf_addr *counter,
2239 struct pf_addr **raddr, struct pf_addr **rmask, sa_family_t af)
2240{
2241 struct pfr_kentry *ke, *ke2;
2242 struct pf_addr *addr;
2243 union sockaddr_union mask;
2244 int idx = -1, use_counter = 0;

--- 73 unchanged lines hidden (view full) ---

2318 struct pfr_walktree w;
2319
2320 bzero(&w, sizeof(w));
2321 w.pfrw_op = PFRW_POOL_GET;
2322 w.pfrw_cnt = idx;
2323
2324 switch(af) {
2325 case AF_INET:
2326#if defined(__FreeBSD__)
2327 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2328#else
2009 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2329 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2330#endif
2010 return w.pfrw_kentry;
2011 case AF_INET6:
2331 return w.pfrw_kentry;
2332 case AF_INET6:
2333#if defined(__FreeBSD__)
2334 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2335#else
2012 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2336 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2337#endif
2013 return w.pfrw_kentry;
2014 default:
2015 return NULL;
2016 }
2017}
2338 return w.pfrw_kentry;
2339 default:
2340 return NULL;
2341 }
2342}
2018