pf_table.c (126261) | pf_table.c (127145) |
---|---|
1/* $FreeBSD: head/sys/contrib/pf/net/pf_table.c 126261 2004-02-26 02:34:12Z mlaier $ */ | 1/* $FreeBSD: head/sys/contrib/pf/net/pf_table.c 127145 2004-03-17 21:11:02Z mlaier $ */ |
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 | 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__) | 34#ifdef __FreeBSD__ |
35#include "opt_inet.h" 36#include "opt_inet6.h" 37#endif 38 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> | 35#include "opt_inet.h" 36#include "opt_inet6.h" 37#endif 38 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__) | 44#ifdef __FreeBSD__ |
45#include <sys/malloc.h> 46#endif 47 48#include <net/if.h> 49#include <net/route.h> 50#include <netinet/in.h> | 45#include <sys/malloc.h> 46#endif 47 48#include <net/if.h> 49#include <net/route.h> 50#include <netinet/in.h> |
51#if !defined(__FreeBSD__) | 51#ifndef __FreeBSD__ |
52#include <netinet/ip_ipsp.h> 53#endif 54 55#include <net/pfvar.h> 56 | 52#include <netinet/ip_ipsp.h> 53#endif 54 55#include <net/pfvar.h> 56 |
57#if defined(FreeBSD__) 58MALLOC_DECLARE(M_RTABLE); 59#endif 60 | |
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 | 57#define ACCEPT_FLAGS(oklist) \ 58 do { \ 59 if ((flags & ~(oklist)) & \ 60 PFR_FLAG_ALLMASK) \ 61 return (EINVAL); \ 62 } while (0) 63 64#define FILLIN_SIN(sin, addr) \ --- 51 unchanged lines hidden (view full) --- 116#define pfrw_addr pfrw_1.pfrw1_addr 117#define pfrw_astats pfrw_1.pfrw1_astats 118#define pfrw_workq pfrw_1.pfrw1_workq 119#define pfrw_kentry pfrw_1.pfrw1_kentry 120#define pfrw_cnt pfrw_free 121 122#define senderr(e) do { rv = (e); goto _bad; } while (0) 123 |
128#if defined(__FreeBSD__) | 124#ifdef __FreeBSD__ |
129uma_zone_t pfr_ktable_pl; 130uma_zone_t pfr_kentry_pl; 131#else 132struct pool pfr_ktable_pl; 133struct pool pfr_kentry_pl; 134#endif 135struct sockaddr_in pfr_sin; 136struct sockaddr_in6 pfr_sin6; --- 51 unchanged lines hidden (view full) --- 188 189struct pfr_ktablehead pfr_ktables; 190struct pfr_table pfr_nulltable; 191int pfr_ktable_cnt; 192 193void 194pfr_initialize(void) 195{ | 125uma_zone_t pfr_ktable_pl; 126uma_zone_t pfr_kentry_pl; 127#else 128struct pool pfr_ktable_pl; 129struct pool pfr_kentry_pl; 130#endif 131struct sockaddr_in pfr_sin; 132struct sockaddr_in6 pfr_sin6; --- 51 unchanged lines hidden (view full) --- 184 185struct pfr_ktablehead pfr_ktables; 186struct pfr_table pfr_nulltable; 187int pfr_ktable_cnt; 188 189void 190pfr_initialize(void) 191{ |
196#if !defined(__FreeBSD__) | 192#ifndef __FreeBSD__ |
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 202 203 pfr_sin.sin_len = sizeof(pfr_sin); 204 pfr_sin.sin_family = AF_INET; --- 39 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; | 193 pool_init(&pfr_ktable_pl, sizeof(struct pfr_ktable), 0, 0, 0, 194 "pfrktable", NULL); 195 pool_init(&pfr_kentry_pl, sizeof(struct pfr_kentry), 0, 0, 0, 196 "pfrkentry", NULL); 197#endif 198 199 pfr_sin.sin_len = sizeof(pfr_sin); 200 pfr_sin.sin_family = AF_INET; --- 39 unchanged lines hidden (view full) --- 240pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size, 241 int *nadd, int flags) 242{ 243 struct pfr_ktable *kt, *tmpkt; 244 struct pfr_kentryworkq workq; 245 struct pfr_kentry *p, *q; 246 struct pfr_addr ad; 247 int i, rv, s, xadd = 0; |
252#if defined(__FreeBSD__) | 248#ifdef __FreeBSD__ |
253 int ec; 254 /* 255 * XXX Is it OK under LP64 environments? 256 */ 257 long tzero = (long)time_second; 258#else 259 long tzero = time.tv_sec; 260#endif --- 6 unchanged lines hidden (view full) --- 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++) { | 249 int ec; 250 /* 251 * XXX Is it OK under LP64 environments? 252 */ 253 long tzero = (long)time_second; 254#else 255 long tzero = time.tv_sec; 256#endif --- 6 unchanged lines hidden (view full) --- 263 return (ESRCH); 264 if (kt->pfrkt_flags & PFR_TFLAG_CONST) 265 return (EPERM); 266 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0); 267 if (tmpkt == NULL) 268 return (ENOMEM); 269 SLIST_INIT(&workq); 270 for (i = 0; i < size; i++) { |
275#if defined(__FreeBSD__) | 271#ifdef __FreeBSD__ |
276 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 277 if (ec) 278 senderr(EFAULT); 279#else 280 if (copyin(addr+i, &ad, sizeof(ad))) 281 senderr(EFAULT); 282#endif 283 if (pfr_validate_addr(&ad)) --- 17 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 } | 272 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 273 if (ec) 274 senderr(EFAULT); 275#else 276 if (copyin(addr+i, &ad, sizeof(ad))) 277 senderr(EFAULT); 278#endif 279 if (pfr_validate_addr(&ad)) --- 17 unchanged lines hidden (view full) --- 297 if (pfr_route_kentry(tmpkt, p)) { 298 pfr_destroy_kentry(p); 299 ad.pfra_fback = PFR_FB_NONE; 300 } else { 301 SLIST_INSERT_HEAD(&workq, p, pfrke_workq); 302 xadd++; 303 } 304 } |
309#if defined(__FreeBSD__) | 305#ifdef __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 316 if (flags & PFR_FLAG_FEEDBACK) 317 if (copyout(&ad, addr+i, sizeof(ad))) --- 26 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; | 306 if (flags & PFR_FLAG_FEEDBACK) { 307 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 308 if (ec) 309 senderr(EFAULT); 310 } 311#else 312 if (flags & PFR_FLAG_FEEDBACK) 313 if (copyout(&ad, addr+i, sizeof(ad))) --- 26 unchanged lines hidden (view full) --- 340pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size, 341 int *ndel, int flags) 342{ 343 struct pfr_ktable *kt; 344 struct pfr_kentryworkq workq; 345 struct pfr_kentry *p; 346 struct pfr_addr ad; 347 int i, rv, s, xdel = 0; |
352#if defined(__FreeBSD__) | 348#ifdef __FreeBSD__ |
353 int ec; 354#endif 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++) { | 349 int ec; 350#endif 351 352 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK); 353 if (pfr_validate_table(tbl, 0)) 354 return (EINVAL); 355 kt = pfr_lookup_table(tbl); 356 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) 357 return (ESRCH); 358 if (kt->pfrkt_flags & PFR_TFLAG_CONST) 359 return (EPERM); 360 pfr_mark_addrs(kt); 361 SLIST_INIT(&workq); 362 for (i = 0; i < size; i++) { |
367#if defined(__FreeBSD__) | 363#ifdef __FreeBSD__ |
368 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 369 if (ec) 370 senderr(EFAULT); 371#else 372 if (copyin(addr+i, &ad, sizeof(ad))) 373 senderr(EFAULT); 374#endif 375 if (pfr_validate_addr(&ad)) --- 10 unchanged lines hidden (view full) --- 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 } | 364 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 365 if (ec) 366 senderr(EFAULT); 367#else 368 if (copyin(addr+i, &ad, sizeof(ad))) 369 senderr(EFAULT); 370#endif 371 if (pfr_validate_addr(&ad)) --- 10 unchanged lines hidden (view full) --- 382 ad.pfra_fback = PFR_FB_DELETED; 383 } 384 if (p != NULL && p->pfrke_not == ad.pfra_not && 385 !p->pfrke_mark) { 386 p->pfrke_mark = 1; 387 SLIST_INSERT_HEAD(&workq, p, pfrke_workq); 388 xdel++; 389 } |
394#if defined(__FreeBSD__) | 390#ifdef __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 401 if (flags & PFR_FLAG_FEEDBACK) 402 if (copyout(&ad, addr+i, sizeof(ad))) --- 20 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; | 391 if (flags & PFR_FLAG_FEEDBACK) { 392 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 393 if (ec) 394 senderr(EFAULT); 395 } 396#else 397 if (flags & PFR_FLAG_FEEDBACK) 398 if (copyout(&ad, addr+i, sizeof(ad))) --- 20 unchanged lines hidden (view full) --- 419pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size, 420 int *size2, int *nadd, int *ndel, int *nchange, int flags) 421{ 422 struct pfr_ktable *kt, *tmpkt; 423 struct pfr_kentryworkq addq, delq, changeq; 424 struct pfr_kentry *p, *q; 425 struct pfr_addr ad; 426 int i, rv, s, xadd = 0, xdel = 0, xchange = 0; |
431#if defined(__FreeBSD__) | 427#ifdef __FreeBSD__ |
432 int ec; 433 /* 434 * XXX Is it OK under LP64 environments? 435 */ 436 long tzero = (long)time_second; 437#else 438 long tzero = time.tv_sec; 439#endif --- 9 unchanged lines hidden (view full) --- 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++) { | 428 int ec; 429 /* 430 * XXX Is it OK under LP64 environments? 431 */ 432 long tzero = (long)time_second; 433#else 434 long tzero = time.tv_sec; 435#endif --- 9 unchanged lines hidden (view full) --- 445 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0); 446 if (tmpkt == NULL) 447 return (ENOMEM); 448 pfr_mark_addrs(kt); 449 SLIST_INIT(&addq); 450 SLIST_INIT(&delq); 451 SLIST_INIT(&changeq); 452 for (i = 0; i < size; i++) { |
457#if defined(__FreeBSD__) | 453#ifdef __FreeBSD__ |
458 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 459 if (ec) 460 senderr(EFAULT); 461#else 462 if (copyin(addr+i, &ad, sizeof(ad))) 463 senderr(EFAULT); 464#endif 465 if (pfr_validate_addr(&ad)) --- 25 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: | 454 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 455 if (ec) 456 senderr(EFAULT); 457#else 458 if (copyin(addr+i, &ad, sizeof(ad))) 459 senderr(EFAULT); 460#endif 461 if (pfr_validate_addr(&ad)) --- 25 unchanged lines hidden (view full) --- 487 ad.pfra_fback = PFR_FB_NONE; 488 } else { 489 SLIST_INSERT_HEAD(&addq, p, pfrke_workq); 490 ad.pfra_fback = PFR_FB_ADDED; 491 xadd++; 492 } 493 } 494_skip: |
499#if defined(__FreeBSD__) | 495#ifdef __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 506 if (flags & PFR_FLAG_FEEDBACK) 507 if (copyout(&ad, addr+i, sizeof(ad))) --- 5 unchanged lines hidden (view full) --- 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; | 496 if (flags & PFR_FLAG_FEEDBACK) { 497 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 498 if (ec) 499 senderr(EFAULT); 500 } 501#else 502 if (flags & PFR_FLAG_FEEDBACK) 503 if (copyout(&ad, addr+i, sizeof(ad))) --- 5 unchanged lines hidden (view full) --- 509 if (*size2 < size+xdel) { 510 *size2 = size+xdel; 511 senderr(0); 512 } 513 i = 0; 514 SLIST_FOREACH(p, &delq, pfrke_workq) { 515 pfr_copyout_addr(&ad, p); 516 ad.pfra_fback = PFR_FB_DELETED; |
521#if defined(__FreeBSD__) | 517#ifdef __FreeBSD__ |
522 PF_COPYOUT(&ad, addr+size+i, sizeof(ad), ec); 523 if (ec) 524 senderr(EFAULT); 525#else 526 if (copyout(&ad, addr+size+i, sizeof(ad))) 527 senderr(EFAULT); 528#endif 529 i++; --- 32 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; | 518 PF_COPYOUT(&ad, addr+size+i, sizeof(ad), ec); 519 if (ec) 520 senderr(EFAULT); 521#else 522 if (copyout(&ad, addr+size+i, sizeof(ad))) 523 senderr(EFAULT); 524#endif 525 i++; --- 32 unchanged lines hidden (view full) --- 558int 559pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size, 560 int *nmatch, int flags) 561{ 562 struct pfr_ktable *kt; 563 struct pfr_kentry *p; 564 struct pfr_addr ad; 565 int i, xmatch = 0; |
570#if defined(__FreeBSD__) | 566#ifdef __FreeBSD__ |
571 int ec; 572#endif 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++) { | 567 int ec; 568#endif 569 570 ACCEPT_FLAGS(PFR_FLAG_REPLACE); 571 if (pfr_validate_table(tbl, 0)) 572 return (EINVAL); 573 kt = pfr_lookup_table(tbl); 574 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) 575 return (ESRCH); 576 577 for (i = 0; i < size; i++) { |
582#if defined(__FreeBSD__) | 578#ifdef __FreeBSD__ |
583 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 584 if (ec) 585 return (EFAULT); 586#else 587 if (copyin(addr+i, &ad, sizeof(ad))) 588 return (EFAULT); 589#endif 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++; | 579 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 580 if (ec) 581 return (EFAULT); 582#else 583 if (copyin(addr+i, &ad, sizeof(ad))) 584 return (EFAULT); 585#endif 586 if (pfr_validate_addr(&ad)) 587 return (EINVAL); 588 if (ADDR_NETWORK(&ad)) 589 return (EINVAL); 590 p = pfr_lookup_addr(kt, &ad, 0); 591 if (flags & PFR_FLAG_REPLACE) 592 pfr_copyout_addr(&ad, p); 593 ad.pfra_fback = (p == NULL) ? PFR_FB_NONE : 594 (p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH); 595 if (p != NULL && !p->pfrke_not) 596 xmatch++; |
601#if defined(__FreeBSD__) | 597#ifdef __FreeBSD__ |
602 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 603 if (ec) 604 return (EFAULT); 605#else 606 if (copyout(&ad, addr+i, sizeof(ad))) 607 return (EFAULT); 608#endif 609 } --- 20 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; | 598 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 599 if (ec) 600 return (EFAULT); 601#else 602 if (copyout(&ad, addr+i, sizeof(ad))) 603 return (EFAULT); 604#endif 605 } --- 20 unchanged lines hidden (view full) --- 626 *size = kt->pfrkt_cnt; 627 return (0); 628 } 629 630 bzero(&w, sizeof(w)); 631 w.pfrw_op = PFRW_GET_ADDRS; 632 w.pfrw_addr = addr; 633 w.pfrw_free = kt->pfrkt_cnt; |
638#if defined(__FreeBSD__) | 634#ifdef __FreeBSD__ |
639 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 640#else 641 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 642#endif 643 if (!rv) | 635 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 636#else 637 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 638#endif 639 if (!rv) |
644#if defined(__FreeBSD__) | 640#ifdef __FreeBSD__ |
645 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 646 &w); 647#else 648 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 649#endif 650 if (rv) 651 return (rv); 652 --- 9 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; | 641 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 642 &w); 643#else 644 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 645#endif 646 if (rv) 647 return (rv); 648 --- 9 unchanged lines hidden (view full) --- 658int 659pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size, 660 int flags) 661{ 662 struct pfr_ktable *kt; 663 struct pfr_walktree w; 664 struct pfr_kentryworkq workq; 665 int rv, s; |
670#if defined(__FreeBSD__) | 666#ifdef __FreeBSD__ |
671 /* 672 * XXX Is it OK under LP64 environments? 673 */ 674 long tzero = (long)time_second; 675#else 676 long tzero = time.tv_sec; 677#endif 678 --- 9 unchanged lines hidden (view full) --- 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(); | 667 /* 668 * XXX Is it OK under LP64 environments? 669 */ 670 long tzero = (long)time_second; 671#else 672 long tzero = time.tv_sec; 673#endif 674 --- 9 unchanged lines hidden (view full) --- 684 } 685 686 bzero(&w, sizeof(w)); 687 w.pfrw_op = PFRW_GET_ASTATS; 688 w.pfrw_astats = addr; 689 w.pfrw_free = kt->pfrkt_cnt; 690 if (flags & PFR_FLAG_ATOMIC) 691 s = splsoftnet(); |
696#if defined(__FreeBSD__) | 692#ifdef __FreeBSD__ |
697 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 698#else 699 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 700#endif 701 if (!rv) | 693 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 694#else 695 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 696#endif 697 if (!rv) |
702#if defined(__FreeBSD__) | 698#ifdef __FreeBSD__ |
703 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 704 &w); 705#else 706 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 707#endif 708 if (!rv && (flags & PFR_FLAG_CLSTATS)) { 709 pfr_enqueue_addrs(kt, &workq, NULL, 0); 710 pfr_clstats_kentries(&workq, tzero, 0); --- 16 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; | 699 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 700 &w); 701#else 702 rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 703#endif 704 if (!rv && (flags & PFR_FLAG_CLSTATS)) { 705 pfr_enqueue_addrs(kt, &workq, NULL, 0); 706 pfr_clstats_kentries(&workq, tzero, 0); --- 16 unchanged lines hidden (view full) --- 723pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size, 724 int *nzero, int flags) 725{ 726 struct pfr_ktable *kt; 727 struct pfr_kentryworkq workq; 728 struct pfr_kentry *p; 729 struct pfr_addr ad; 730 int i, rv, s, xzero = 0; |
735#if defined(__FreeBSD__) | 731#ifdef __FreeBSD__ |
736 int ec; 737#endif 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++) { | 732 int ec; 733#endif 734 735 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK); 736 if (pfr_validate_table(tbl, 0)) 737 return (EINVAL); 738 kt = pfr_lookup_table(tbl); 739 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) 740 return (ESRCH); 741 SLIST_INIT(&workq); 742 for (i = 0; i < size; i++) { |
747#if defined(__FreeBSD__) | 743#ifdef __FreeBSD__ |
748 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 749 if (ec) 750 senderr(EFAULT); 751#else 752 if (copyin(addr+i, &ad, sizeof(ad))) 753 senderr(EFAULT); 754#endif 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; | 744 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 745 if (ec) 746 senderr(EFAULT); 747#else 748 if (copyin(addr+i, &ad, sizeof(ad))) 749 senderr(EFAULT); 750#endif 751 if (pfr_validate_addr(&ad)) 752 senderr(EINVAL); 753 p = pfr_lookup_addr(kt, &ad, 1); 754 if (flags & PFR_FLAG_FEEDBACK) { 755 ad.pfra_fback = (p != NULL) ? 756 PFR_FB_CLEARED : PFR_FB_NONE; |
761#if defined(__FreeBSD__) | 757#ifdef __FreeBSD__ |
762 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 763 if (ec) 764 senderr(EFAULT); 765#else 766 if (copyout(&ad, addr+i, sizeof(ad))) 767 senderr(EFAULT); 768#endif 769 } --- 55 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) | 758 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 759 if (ec) 760 senderr(EFAULT); 761#else 762 if (copyout(&ad, addr+i, sizeof(ad))) 763 senderr(EFAULT); 764#endif 765 } --- 55 unchanged lines hidden (view full) --- 821{ 822 struct pfr_walktree w; 823 824 SLIST_INIT(workq); 825 bzero(&w, sizeof(w)); 826 w.pfrw_op = sweep ? PFRW_SWEEP : PFRW_ENQUEUE; 827 w.pfrw_workq = workq; 828 if (kt->pfrkt_ip4 != NULL) |
833#if defined(__FreeBSD__) | 829#ifdef __FreeBSD__ |
834 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, 835 &w)) 836#else 837 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 838#endif 839 printf("pfr_enqueue_addrs: IPv4 walktree failed.\n"); 840 if (kt->pfrkt_ip6 != NULL) | 830 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, 831 &w)) 832#else 833 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 834#endif 835 printf("pfr_enqueue_addrs: IPv4 walktree failed.\n"); 836 if (kt->pfrkt_ip6 != NULL) |
841#if defined(__FreeBSD__) | 837#ifdef __FreeBSD__ |
842 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 843 &w)) 844#else 845 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 846#endif 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; | 838 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, 839 &w)) 840#else 841 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 842#endif 843 printf("pfr_enqueue_addrs: IPv6 walktree failed.\n"); 844 if (naddr != NULL) 845 *naddr = w.pfrw_cnt; 846} 847 848void 849pfr_mark_addrs(struct pfr_ktable *kt) 850{ 851 struct pfr_walktree w; 852 853 bzero(&w, sizeof(w)); 854 w.pfrw_op = PFRW_MARK; |
859#if defined(__FreeBSD__) | 855#ifdef __FreeBSD__ |
860 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 861#else 862 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 863#endif 864 printf("pfr_mark_addrs: IPv4 walktree failed.\n"); | 856 if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 857#else 858 if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w)) 859#endif 860 printf("pfr_mark_addrs: IPv4 walktree failed.\n"); |
865#if defined(__FreeBSD__) | 861#ifdef __FreeBSD__ |
866 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 867#else 868 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 869#endif 870 printf("pfr_mark_addrs: IPv6 walktree failed.\n"); 871} 872 873 --- 135 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; | 862 if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 863#else 864 if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w)) 865#endif 866 printf("pfr_mark_addrs: IPv6 walktree failed.\n"); 867} 868 869 --- 135 unchanged lines hidden (view full) --- 1005 } 1006} 1007 1008void 1009pfr_reset_feedback(struct pfr_addr *addr, int size) 1010{ 1011 struct pfr_addr ad; 1012 int i; |
1017#if defined(__FreeBSD__) | 1013#ifdef __FreeBSD__ |
1018 int ec; 1019#endif 1020 1021 for (i = 0; i < size; i++) { | 1014 int ec; 1015#endif 1016 1017 for (i = 0; i < size; i++) { |
1022#if defined(__FreeBSD__) | 1018#ifdef __FreeBSD__ |
1023 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 1024 if (ec) 1025 break; 1026#else 1027 if (copyin(addr+i, &ad, sizeof(ad))) 1028 break; 1029#endif 1030 ad.pfra_fback = PFR_FB_NONE; | 1019 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 1020 if (ec) 1021 break; 1022#else 1023 if (copyin(addr+i, &ad, sizeof(ad))) 1024 break; 1025#endif 1026 ad.pfra_fback = PFR_FB_NONE; |
1031#if defined(__FreeBSD__) | 1027#ifdef __FreeBSD__ |
1032 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 1033 if (ec) 1034 break; 1035#else 1036 if (copyout(&ad, addr+i, sizeof(ad))) 1037 break; 1038#endif 1039 } --- 105 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; | 1028 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec); 1029 if (ec) 1030 break; 1031#else 1032 if (copyout(&ad, addr+i, sizeof(ad))) 1033 break; 1034#endif 1035 } --- 105 unchanged lines hidden (view full) --- 1141} 1142 1143int 1144pfr_walktree(struct radix_node *rn, void *arg) 1145{ 1146 struct pfr_kentry *ke = (struct pfr_kentry *)rn; 1147 struct pfr_walktree *w = arg; 1148 int s; |
1153#if defined(__FreeBSD__) | 1149#ifdef __FreeBSD__ |
1154 int ec; 1155#endif 1156 1157 switch (w->pfrw_op) { 1158 case PFRW_MARK: 1159 ke->pfrke_mark = 0; 1160 break; 1161 case PFRW_SWEEP: --- 4 unchanged lines hidden (view full) --- 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); | 1150 int ec; 1151#endif 1152 1153 switch (w->pfrw_op) { 1154 case PFRW_MARK: 1155 ke->pfrke_mark = 0; 1156 break; 1157 case PFRW_SWEEP: --- 4 unchanged lines hidden (view full) --- 1162 SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq); 1163 w->pfrw_cnt++; 1164 break; 1165 case PFRW_GET_ADDRS: 1166 if (w->pfrw_free-- > 0) { 1167 struct pfr_addr ad; 1168 1169 pfr_copyout_addr(&ad, ke); |
1174#if defined(__FreeBSD__) | 1170#ifdef __FreeBSD__ |
1175 PF_COPYOUT(&ad, w->pfrw_addr, sizeof(ad), ec); 1176 if (ec) 1177 return (EFAULT); 1178#else 1179 if (copyout(&ad, w->pfrw_addr, sizeof(ad))) 1180 return (EFAULT); 1181#endif 1182 w->pfrw_addr++; --- 8 unchanged lines hidden (view full) --- 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 | 1171 PF_COPYOUT(&ad, w->pfrw_addr, sizeof(ad), ec); 1172 if (ec) 1173 return (EFAULT); 1174#else 1175 if (copyout(&ad, w->pfrw_addr, sizeof(ad))) 1176 return (EFAULT); 1177#endif 1178 w->pfrw_addr++; --- 8 unchanged lines hidden (view full) --- 1187 s = splsoftnet(); 1188 bcopy(ke->pfrke_packets, as.pfras_packets, 1189 sizeof(as.pfras_packets)); 1190 bcopy(ke->pfrke_bytes, as.pfras_bytes, 1191 sizeof(as.pfras_bytes)); 1192 splx(s); 1193 as.pfras_tzero = ke->pfrke_tzero; 1194 |
1199#if defined(__FreeBSD__) | 1195#ifdef __FreeBSD__ |
1200 PF_COPYOUT(&as, w->pfrw_astats, sizeof(as), ec); 1201 if (ec) 1202 return (EFAULT); 1203#else 1204 if (copyout(&as, w->pfrw_astats, sizeof(as))) 1205 return (EFAULT); 1206#endif 1207 w->pfrw_astats++; --- 45 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; | 1196 PF_COPYOUT(&as, w->pfrw_astats, sizeof(as), ec); 1197 if (ec) 1198 return (EFAULT); 1199#else 1200 if (copyout(&as, w->pfrw_astats, sizeof(as))) 1201 return (EFAULT); 1202#endif 1203 w->pfrw_astats++; --- 45 unchanged lines hidden (view full) --- 1249} 1250 1251int 1252pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags) 1253{ 1254 struct pfr_ktableworkq addq, changeq; 1255 struct pfr_ktable *p, *q, *r, key; 1256 int i, rv, s, xadd = 0; |
1261#if defined(__FreeBSD__) | 1257#ifdef __FreeBSD__ |
1262 int ec; 1263 /* 1264 * XXX Is it OK under LP64 environments? 1265 */ 1266 long tzero = (long)time_second; 1267#else 1268 long tzero = time.tv_sec; 1269#endif 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++) { | 1258 int ec; 1259 /* 1260 * XXX Is it OK under LP64 environments? 1261 */ 1262 long tzero = (long)time_second; 1263#else 1264 long tzero = time.tv_sec; 1265#endif 1266 1267 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY); 1268 SLIST_INIT(&addq); 1269 SLIST_INIT(&changeq); 1270 for (i = 0; i < size; i++) { |
1275#if defined(__FreeBSD__) | 1271#ifdef __FreeBSD__ |
1276 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1277 if (ec) 1278 senderr(EFAULT); 1279#else 1280 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1281 senderr(EFAULT); 1282#endif 1283 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK)) --- 63 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; | 1272 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1273 if (ec) 1274 senderr(EFAULT); 1275#else 1276 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1277 senderr(EFAULT); 1278#endif 1279 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK)) --- 63 unchanged lines hidden (view full) --- 1343} 1344 1345int 1346pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags) 1347{ 1348 struct pfr_ktableworkq workq; 1349 struct pfr_ktable *p, *q, key; 1350 int i, s, xdel = 0; |
1355#if defined(__FreeBSD__) | 1351#ifdef __FreeBSD__ |
1356 int ec; 1357#endif 1358 1359 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY); 1360 SLIST_INIT(&workq); 1361 for (i = 0; i < size; i++) { | 1352 int ec; 1353#endif 1354 1355 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY); 1356 SLIST_INIT(&workq); 1357 for (i = 0; i < size; i++) { |
1362#if defined(__FreeBSD__) | 1358#ifdef __FreeBSD__ |
1363 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1364 if (ec) 1365 return (EFAULT); 1366#else 1367 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1368 return (EFAULT); 1369#endif 1370 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 24 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; | 1359 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1360 if (ec) 1361 return (EFAULT); 1362#else 1363 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1364 return (EFAULT); 1365#endif 1366 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 24 unchanged lines hidden (view full) --- 1391} 1392 1393int 1394pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size, 1395 int flags) 1396{ 1397 struct pfr_ktable *p; 1398 int n, nn; |
1403#if defined(__FreeBSD__) | 1399#ifdef __FreeBSD__ |
1404 int ec; 1405#endif 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; | 1400 int ec; 1401#endif 1402 1403 ACCEPT_FLAGS(PFR_FLAG_ALLRSETS); 1404 n = nn = pfr_table_count(filter, flags); 1405 if (n < 0) 1406 return (ENOENT); 1407 if (n > *size) { 1408 *size = n; 1409 return (0); 1410 } 1411 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) { 1412 if (pfr_skip_table(filter, p, flags)) 1413 continue; 1414 if (n-- <= 0) 1415 continue; |
1420#if defined(__FreeBSD__) | 1416#ifdef __FreeBSD__ |
1421 PF_COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl), ec); 1422 if (ec) 1423 return (EFAULT); 1424#else 1425 if (copyout(&p->pfrkt_t, tbl++, sizeof(*tbl))) 1426 return (EFAULT); 1427#endif 1428 } --- 7 unchanged lines hidden (view full) --- 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; | 1417 PF_COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl), ec); 1418 if (ec) 1419 return (EFAULT); 1420#else 1421 if (copyout(&p->pfrkt_t, tbl++, sizeof(*tbl))) 1422 return (EFAULT); 1423#endif 1424 } --- 7 unchanged lines hidden (view full) --- 1432 1433int 1434pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size, 1435 int flags) 1436{ 1437 struct pfr_ktable *p; 1438 struct pfr_ktableworkq workq; 1439 int s, n, nn; |
1444#if defined(__FreeBSD__) | 1440#ifdef __FreeBSD__ |
1445 int ec; 1446 /* 1447 * XXX Is it OK under LP64 environments? 1448 */ 1449 long tzero = (long)time_second; 1450#else 1451 long tzero = time.tv_sec; 1452#endif --- 12 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(); | 1441 int ec; 1442 /* 1443 * XXX Is it OK under LP64 environments? 1444 */ 1445 long tzero = (long)time_second; 1446#else 1447 long tzero = time.tv_sec; 1448#endif --- 12 unchanged lines hidden (view full) --- 1461 s = splsoftnet(); 1462 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) { 1463 if (pfr_skip_table(filter, p, flags)) 1464 continue; 1465 if (n-- <= 0) 1466 continue; 1467 if (!(flags & PFR_FLAG_ATOMIC)) 1468 s = splsoftnet(); |
1473#if defined(__FreeBSD__) | 1469#ifdef __FreeBSD__ |
1474 PF_COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl), ec); 1475 if (ec) { 1476 splx(s); 1477 return (EFAULT); 1478 } 1479#else 1480 if (copyout(&p->pfrkt_ts, tbl++, sizeof(*tbl))) { 1481 splx(s); --- 18 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; | 1470 PF_COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl), ec); 1471 if (ec) { 1472 splx(s); 1473 return (EFAULT); 1474 } 1475#else 1476 if (copyout(&p->pfrkt_ts, tbl++, sizeof(*tbl))) { 1477 splx(s); --- 18 unchanged lines hidden (view full) --- 1496} 1497 1498int 1499pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags) 1500{ 1501 struct pfr_ktableworkq workq; 1502 struct pfr_ktable *p, key; 1503 int i, s, xzero = 0; |
1508#if defined(__FreeBSD__) | 1504#ifdef __FreeBSD__ |
1509 int ec; 1510 /* 1511 * XXX Is it OK under LP64 environments? 1512 */ 1513 long tzero = (long)time_second; 1514#else 1515 long tzero = time.tv_sec; 1516#endif 1517 1518 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO); 1519 SLIST_INIT(&workq); 1520 for (i = 0; i < size; i++) { | 1505 int ec; 1506 /* 1507 * XXX Is it OK under LP64 environments? 1508 */ 1509 long tzero = (long)time_second; 1510#else 1511 long tzero = time.tv_sec; 1512#endif 1513 1514 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO); 1515 SLIST_INIT(&workq); 1516 for (i = 0; i < size; i++) { |
1521#if defined(__FreeBSD__) | 1517#ifdef __FreeBSD__ |
1522 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1523 if (ec) 1524 return (EFAULT); 1525#else 1526 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1527 return (EFAULT); 1528#endif 1529 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 18 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; | 1518 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1519 if (ec) 1520 return (EFAULT); 1521#else 1522 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1523 return (EFAULT); 1524#endif 1525 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 18 unchanged lines hidden (view full) --- 1544 1545int 1546pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag, 1547 int *nchange, int *ndel, int flags) 1548{ 1549 struct pfr_ktableworkq workq; 1550 struct pfr_ktable *p, *q, key; 1551 int i, s, xchange = 0, xdel = 0; |
1556#if defined(__FreeBSD__) | 1552#ifdef __FreeBSD__ |
1557 int ec; 1558#endif 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++) { | 1553 int ec; 1554#endif 1555 1556 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY); 1557 if ((setflag & ~PFR_TFLAG_USRMASK) || 1558 (clrflag & ~PFR_TFLAG_USRMASK) || 1559 (setflag & clrflag)) 1560 return (EINVAL); 1561 SLIST_INIT(&workq); 1562 for (i = 0; i < size; i++) { |
1567#if defined(__FreeBSD__) | 1563#ifdef __FreeBSD__ |
1568 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1569 if (ec) 1570 return (EFAULT); 1571#else 1572 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1573 return (EFAULT); 1574#endif 1575 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 71 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; | 1564 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec); 1565 if (ec) 1566 return (EFAULT); 1567#else 1568 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t))) 1569 return (EFAULT); 1570#endif 1571 if (pfr_validate_table(&key.pfrkt_t, 0)) --- 71 unchanged lines hidden (view full) --- 1643{ 1644 struct pfr_ktableworkq tableq; 1645 struct pfr_kentryworkq addrq; 1646 struct pfr_ktable *kt, *rt, *shadow, key; 1647 struct pfr_kentry *p; 1648 struct pfr_addr ad; 1649 struct pf_ruleset *rs; 1650 int i, rv, xadd = 0, xaddr = 0; |
1655#if defined(__FreeBSD__) | 1651#ifdef __FreeBSD__ |
1656 int ec; 1657#endif 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); --- 32 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++) { | 1652 int ec; 1653#endif 1654 1655 ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO); 1656 if (size && !(flags & PFR_FLAG_ADDRSTOO)) 1657 return (EINVAL); 1658 if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK)) 1659 return (EINVAL); --- 32 unchanged lines hidden (view full) --- 1692_skip: 1693 shadow = pfr_create_ktable(tbl, 0, 0); 1694 if (shadow == NULL) { 1695 pfr_destroy_ktables(&tableq, 0); 1696 return (ENOMEM); 1697 } 1698 SLIST_INIT(&addrq); 1699 for (i = 0; i < size; i++) { |
1704#if defined(__FreeBSD__) | 1700#ifdef __FreeBSD__ |
1705 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 1706 if (ec) 1707 senderr(EFAULT); 1708#else 1709 if (copyin(addr+i, &ad, sizeof(ad))) 1710 senderr(EFAULT); 1711#endif 1712 if (pfr_validate_addr(&ad)) --- 39 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; | 1701 PF_COPYIN(addr+i, &ad, sizeof(ad), ec); 1702 if (ec) 1703 senderr(EFAULT); 1704#else 1705 if (copyin(addr+i, &ad, sizeof(ad))) 1706 senderr(EFAULT); 1707#endif 1708 if (pfr_validate_addr(&ad)) --- 39 unchanged lines hidden (view full) --- 1748int 1749pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd, 1750 int *nchange, int flags) 1751{ 1752 struct pfr_ktable *p; 1753 struct pfr_ktableworkq workq; 1754 struct pf_ruleset *rs; 1755 int s, xadd = 0, xchange = 0; |
1760#if defined(__FreeBSD__) | 1756#ifdef __FreeBSD__ |
1761 /* 1762 * XXX Is it OK under LP64 environments? 1763 */ 1764 long tzero = (long)time_second; 1765#else 1766 long tzero = time.tv_sec; 1767#endif 1768 --- 418 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) { | 1757 /* 1758 * XXX Is it OK under LP64 environments? 1759 */ 1760 long tzero = (long)time_second; 1761#else 1762 long tzero = time.tv_sec; 1763#endif 1764 --- 418 unchanged lines hidden (view full) --- 2183 bzero(&tbl, sizeof(tbl)); 2184 strlcpy(tbl.pfrt_name, name, sizeof(tbl.pfrt_name)); 2185 if (ac != NULL) { 2186 strlcpy(tbl.pfrt_anchor, ac->name, sizeof(tbl.pfrt_anchor)); 2187 strlcpy(tbl.pfrt_ruleset, rs->name, sizeof(tbl.pfrt_ruleset)); 2188 } 2189 kt = pfr_lookup_table(&tbl); 2190 if (kt == NULL) { |
2195#if defined(__FreeBSD__) | 2191#ifdef __FreeBSD__ |
2196 /* 2197 * XXX Is it OK under LP64 environments? 2198 */ 2199 kt = pfr_create_ktable(&tbl, (long)time_second, 1); 2200#else 2201 kt = pfr_create_ktable(&tbl, time.tv_sec, 1); 2202#endif 2203 if (kt == NULL) --- 114 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: | 2192 /* 2193 * XXX Is it OK under LP64 environments? 2194 */ 2195 kt = pfr_create_ktable(&tbl, (long)time_second, 1); 2196#else 2197 kt = pfr_create_ktable(&tbl, time.tv_sec, 1); 2198#endif 2199 if (kt == NULL) --- 114 unchanged lines hidden (view full) --- 2314 struct pfr_walktree w; 2315 2316 bzero(&w, sizeof(w)); 2317 w.pfrw_op = PFRW_POOL_GET; 2318 w.pfrw_cnt = idx; 2319 2320 switch(af) { 2321 case AF_INET: |
2326#if defined(__FreeBSD__) | 2322#ifdef __FreeBSD__ |
2327 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 2328#else 2329 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 2330#endif 2331 return w.pfrw_kentry; 2332 case AF_INET6: | 2323 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 2324#else 2325 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w); 2326#endif 2327 return w.pfrw_kentry; 2328 case AF_INET6: |
2333#if defined(__FreeBSD__) | 2329#ifdef __FreeBSD__ |
2334 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 2335#else 2336 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 2337#endif 2338 return w.pfrw_kentry; 2339 default: 2340 return NULL; 2341 } 2342} | 2330 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 2331#else 2332 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w); 2333#endif 2334 return w.pfrw_kentry; 2335 default: 2336 return NULL; 2337 } 2338} |