Deleted Added
full compact
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 ---