ip_fw_nat.c (181803) | ip_fw_nat.c (183550) |
---|---|
1/*- 2 * Copyright (c) 2008 Paolo Pisati 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2008 Paolo Pisati 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/netinet/ip_fw_nat.c 181803 2008-08-17 23:27:27Z bz $"); | 28__FBSDID("$FreeBSD: head/sys/netinet/ip_fw_nat.c 183550 2008-10-02 15:37:58Z zec $"); |
29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/condvar.h> 33#include <sys/eventhandler.h> 34#include <sys/malloc.h> 35#include <sys/mbuf.h> 36#include <sys/kernel.h> --- 40 unchanged lines hidden (view full) --- 77extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; 78extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; 79extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; 80extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; 81 82static void 83ifaddr_change(void *arg __unused, struct ifnet *ifp) 84{ | 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/condvar.h> 33#include <sys/eventhandler.h> 34#include <sys/malloc.h> 35#include <sys/mbuf.h> 36#include <sys/kernel.h> --- 40 unchanged lines hidden (view full) --- 77extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; 78extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; 79extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; 80extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; 81 82static void 83ifaddr_change(void *arg __unused, struct ifnet *ifp) 84{ |
85 INIT_VNET_IPFW(curvnet); |
|
85 struct cfg_nat *ptr; 86 struct ifaddr *ifa; 87 88 IPFW_WLOCK(&V_layer3_chain); 89 /* Check every nat entry... */ 90 LIST_FOREACH(ptr, &V_layer3_chain.nat, _next) { 91 /* ...using nic 'ifp->if_xname' as dynamic alias address. */ 92 if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) == 0) { --- 11 unchanged lines hidden (view full) --- 104 } 105 } 106 IPFW_WUNLOCK(&V_layer3_chain); 107} 108 109static void 110flush_nat_ptrs(const int i) 111{ | 86 struct cfg_nat *ptr; 87 struct ifaddr *ifa; 88 89 IPFW_WLOCK(&V_layer3_chain); 90 /* Check every nat entry... */ 91 LIST_FOREACH(ptr, &V_layer3_chain.nat, _next) { 92 /* ...using nic 'ifp->if_xname' as dynamic alias address. */ 93 if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) == 0) { --- 11 unchanged lines hidden (view full) --- 105 } 106 } 107 IPFW_WUNLOCK(&V_layer3_chain); 108} 109 110static void 111flush_nat_ptrs(const int i) 112{ |
113 INIT_VNET_IPFW(curvnet); |
|
112 struct ip_fw *rule; 113 114 IPFW_WLOCK_ASSERT(&V_layer3_chain); 115 for (rule = V_layer3_chain.rules; rule; rule = rule->next) { 116 ipfw_insn_nat *cmd = (ipfw_insn_nat *)ACTION_PTR(rule); 117 if (cmd->o.opcode != O_NAT) 118 continue; 119 if (cmd->nat != NULL && cmd->nat->id == i) --- 279 unchanged lines hidden (view full) --- 399 400 args->m = mcl; 401 return (IP_FW_NAT); 402} 403 404static int 405ipfw_nat_cfg(struct sockopt *sopt) 406{ | 114 struct ip_fw *rule; 115 116 IPFW_WLOCK_ASSERT(&V_layer3_chain); 117 for (rule = V_layer3_chain.rules; rule; rule = rule->next) { 118 ipfw_insn_nat *cmd = (ipfw_insn_nat *)ACTION_PTR(rule); 119 if (cmd->o.opcode != O_NAT) 120 continue; 121 if (cmd->nat != NULL && cmd->nat->id == i) --- 279 unchanged lines hidden (view full) --- 401 402 args->m = mcl; 403 return (IP_FW_NAT); 404} 405 406static int 407ipfw_nat_cfg(struct sockopt *sopt) 408{ |
409 INIT_VNET_IPFW(curvnet); |
|
407 struct cfg_nat *ptr, *ser_n; 408 char *buf; 409 410 buf = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); 411 sooptcopyin(sopt, buf, NAT_BUF_LEN, 412 sizeof(struct cfg_nat)); 413 ser_n = (struct cfg_nat *)buf; 414 --- 54 unchanged lines hidden (view full) --- 469 HOOK_NAT(&V_layer3_chain.nat, ptr); 470 IPFW_WUNLOCK(&V_layer3_chain); 471 return (0); 472} 473 474static int 475ipfw_nat_del(struct sockopt *sopt) 476{ | 410 struct cfg_nat *ptr, *ser_n; 411 char *buf; 412 413 buf = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); 414 sooptcopyin(sopt, buf, NAT_BUF_LEN, 415 sizeof(struct cfg_nat)); 416 ser_n = (struct cfg_nat *)buf; 417 --- 54 unchanged lines hidden (view full) --- 472 HOOK_NAT(&V_layer3_chain.nat, ptr); 473 IPFW_WUNLOCK(&V_layer3_chain); 474 return (0); 475} 476 477static int 478ipfw_nat_del(struct sockopt *sopt) 479{ |
480 INIT_VNET_IPFW(curvnet); |
|
477 struct cfg_nat *ptr; 478 int i; 479 480 sooptcopyin(sopt, &i, sizeof i, sizeof i); 481 IPFW_WLOCK(&V_layer3_chain); 482 LOOKUP_NAT(V_layer3_chain, i, ptr); 483 if (ptr == NULL) { 484 IPFW_WUNLOCK(&V_layer3_chain); --- 6 unchanged lines hidden (view full) --- 491 LibAliasUninit(ptr->lib); 492 free(ptr, M_IPFW); 493 return (0); 494} 495 496static int 497ipfw_nat_get_cfg(struct sockopt *sopt) 498{ | 481 struct cfg_nat *ptr; 482 int i; 483 484 sooptcopyin(sopt, &i, sizeof i, sizeof i); 485 IPFW_WLOCK(&V_layer3_chain); 486 LOOKUP_NAT(V_layer3_chain, i, ptr); 487 if (ptr == NULL) { 488 IPFW_WUNLOCK(&V_layer3_chain); --- 6 unchanged lines hidden (view full) --- 495 LibAliasUninit(ptr->lib); 496 free(ptr, M_IPFW); 497 return (0); 498} 499 500static int 501ipfw_nat_get_cfg(struct sockopt *sopt) 502{ |
503 INIT_VNET_IPFW(curvnet); |
|
499 uint8_t *data; 500 struct cfg_nat *n; 501 struct cfg_redir *r; 502 struct cfg_spool *s; 503 int nat_cnt, off; 504 505 nat_cnt = 0; 506 off = sizeof(nat_cnt); --- 38 unchanged lines hidden (view full) --- 545 "please increase NAT_BUF_LEN\n"); 546 free(data, M_IPFW); 547 return (ENOSPC); 548} 549 550static int 551ipfw_nat_get_log(struct sockopt *sopt) 552{ | 504 uint8_t *data; 505 struct cfg_nat *n; 506 struct cfg_redir *r; 507 struct cfg_spool *s; 508 int nat_cnt, off; 509 510 nat_cnt = 0; 511 off = sizeof(nat_cnt); --- 38 unchanged lines hidden (view full) --- 550 "please increase NAT_BUF_LEN\n"); 551 free(data, M_IPFW); 552 return (ENOSPC); 553} 554 555static int 556ipfw_nat_get_log(struct sockopt *sopt) 557{ |
558 INIT_VNET_IPFW(curvnet); |
|
553 uint8_t *data; 554 struct cfg_nat *ptr; 555 int i, size, cnt, sof; 556 557 data = NULL; 558 sof = LIBALIAS_BUF_SIZE; 559 cnt = 0; 560 --- 18 unchanged lines hidden (view full) --- 579 sooptcopyout(sopt, data, size); 580 free(data, M_IPFW); 581 return(0); 582} 583 584static void 585ipfw_nat_init(void) 586{ | 559 uint8_t *data; 560 struct cfg_nat *ptr; 561 int i, size, cnt, sof; 562 563 data = NULL; 564 sof = LIBALIAS_BUF_SIZE; 565 cnt = 0; 566 --- 18 unchanged lines hidden (view full) --- 585 sooptcopyout(sopt, data, size); 586 free(data, M_IPFW); 587 return(0); 588} 589 590static void 591ipfw_nat_init(void) 592{ |
593 INIT_VNET_IPFW(curvnet); |
|
587 588 IPFW_WLOCK(&V_layer3_chain); 589 /* init ipfw hooks */ 590 ipfw_nat_ptr = ipfw_nat; 591 ipfw_nat_cfg_ptr = ipfw_nat_cfg; 592 ipfw_nat_del_ptr = ipfw_nat_del; 593 ipfw_nat_get_cfg_ptr = ipfw_nat_get_cfg; 594 ipfw_nat_get_log_ptr = ipfw_nat_get_log; 595 IPFW_WUNLOCK(&V_layer3_chain); 596 V_ifaddr_event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_change, 597 NULL, EVENTHANDLER_PRI_ANY); 598} 599 600static void 601ipfw_nat_destroy(void) 602{ | 594 595 IPFW_WLOCK(&V_layer3_chain); 596 /* init ipfw hooks */ 597 ipfw_nat_ptr = ipfw_nat; 598 ipfw_nat_cfg_ptr = ipfw_nat_cfg; 599 ipfw_nat_del_ptr = ipfw_nat_del; 600 ipfw_nat_get_cfg_ptr = ipfw_nat_get_cfg; 601 ipfw_nat_get_log_ptr = ipfw_nat_get_log; 602 IPFW_WUNLOCK(&V_layer3_chain); 603 V_ifaddr_event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_change, 604 NULL, EVENTHANDLER_PRI_ANY); 605} 606 607static void 608ipfw_nat_destroy(void) 609{ |
610 INIT_VNET_IPFW(curvnet); |
|
603 struct ip_fw *rule; 604 struct cfg_nat *ptr, *ptr_temp; 605 606 IPFW_WLOCK(&V_layer3_chain); 607 LIST_FOREACH_SAFE(ptr, &V_layer3_chain.nat, _next, ptr_temp) { 608 LIST_REMOVE(ptr, _next); 609 del_redir_spool_cfg(ptr, &ptr->redir_chain); 610 LibAliasUninit(ptr->lib); --- 45 unchanged lines hidden --- | 611 struct ip_fw *rule; 612 struct cfg_nat *ptr, *ptr_temp; 613 614 IPFW_WLOCK(&V_layer3_chain); 615 LIST_FOREACH_SAFE(ptr, &V_layer3_chain.nat, _next, ptr_temp) { 616 LIST_REMOVE(ptr, _next); 617 del_redir_spool_cfg(ptr, &ptr->redir_chain); 618 LibAliasUninit(ptr->lib); --- 45 unchanged lines hidden --- |