Path: blob/main/sys/netpfil/ipfw/nat64/ip_fw_nat64.c
39536 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2015-2019 Yandex LLC4* Copyright (c) 2015-2019 Andrey V. Elsukov <[email protected]>5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9*10* 1. Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12* 2. Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR17* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES18* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.19* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,20* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT21* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,22* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY23* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF25* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.26*/2728#include <sys/param.h>29#include <sys/systm.h>30#include <sys/kernel.h>31#include <sys/lock.h>32#include <sys/malloc.h>33#include <sys/module.h>34#include <sys/rwlock.h>35#include <sys/socket.h>36#include <sys/sysctl.h>3738#include <net/if.h>39#include <net/vnet.h>4041#include <netinet/in.h>42#include <netinet/ip_var.h>43#include <netinet/ip_fw.h>4445#include <netpfil/ipfw/ip_fw_private.h>4647#include "ip_fw_nat64.h"48#include "nat64_translate.h"4950VNET_DEFINE(int, nat64_debug) = 0;5152SYSCTL_DECL(_net_inet_ip_fw);53SYSCTL_INT(_net_inet_ip_fw, OID_AUTO, nat64_debug, CTLFLAG_VNET | CTLFLAG_RW,54&VNET_NAME(nat64_debug), 0, "Debug level for NAT64 module");5556static int57sysctl_direct_output(SYSCTL_HANDLER_ARGS)58{59uint32_t value;60int error;6162value = nat64_get_output_method();63error = sysctl_handle_32(oidp, &value, 0, req);64/* Read operation or some error */65if ((error != 0) || (req->newptr == NULL))66return (error);67nat64_set_output_method(value);68return (0);69}70SYSCTL_PROC(_net_inet_ip_fw, OID_AUTO, nat64_direct_output,71CTLFLAG_VNET | CTLTYPE_U32 | CTLFLAG_RW | CTLFLAG_NEEDGIANT,720, 0, sysctl_direct_output, "IU",73"Use if_output directly instead of deffered netisr-based processing");7475static int76vnet_ipfw_nat64_init(const void *arg __unused)77{78struct ip_fw_chain *ch;79int first, error;8081ch = &V_layer3_chain;82first = IS_DEFAULT_VNET(curvnet) ? 1: 0;83/* Initialize V_nat64out methods explicitly. */84nat64_set_output_method(0);85error = nat64stl_init(ch, first);86if (error != 0)87return (error);88error = nat64clat_init(ch, first);89if (error != 0) {90nat64stl_uninit(ch, first);91return (error);92}93error = nat64lsn_init(ch, first);94if (error != 0) {95nat64stl_uninit(ch, first);96nat64clat_uninit(ch, first);97return (error);98}99return (0);100}101102static int103vnet_ipfw_nat64_uninit(const void *arg __unused)104{105struct ip_fw_chain *ch;106int last;107108ch = &V_layer3_chain;109last = IS_DEFAULT_VNET(curvnet) ? 1: 0;110nat64stl_uninit(ch, last);111nat64clat_uninit(ch, last);112nat64lsn_uninit(ch, last);113return (0);114}115116static int117ipfw_nat64_modevent(module_t mod, int type, void *unused)118{119120switch (type) {121case MOD_LOAD:122case MOD_UNLOAD:123break;124default:125return (EOPNOTSUPP);126}127return (0);128}129130static moduledata_t ipfw_nat64_mod = {131"ipfw_nat64",132ipfw_nat64_modevent,1330134};135136/* Define startup order. */137#define IPFW_NAT64_SI_SUB_FIREWALL SI_SUB_PROTO_IFATTACHDOMAIN138#define IPFW_NAT64_MODEVENT_ORDER (SI_ORDER_ANY - 128) /* after ipfw */139#define IPFW_NAT64_MODULE_ORDER (IPFW_NAT64_MODEVENT_ORDER + 1)140#define IPFW_NAT64_VNET_ORDER (IPFW_NAT64_MODEVENT_ORDER + 2)141142DECLARE_MODULE(ipfw_nat64, ipfw_nat64_mod, IPFW_NAT64_SI_SUB_FIREWALL,143SI_ORDER_ANY);144MODULE_DEPEND(ipfw_nat64, ipfw, 3, 3, 3);145MODULE_VERSION(ipfw_nat64, 1);146147VNET_SYSINIT(vnet_ipfw_nat64_init, IPFW_NAT64_SI_SUB_FIREWALL,148IPFW_NAT64_VNET_ORDER, vnet_ipfw_nat64_init, NULL);149VNET_SYSUNINIT(vnet_ipfw_nat64_uninit, IPFW_NAT64_SI_SUB_FIREWALL,150IPFW_NAT64_VNET_ORDER, vnet_ipfw_nat64_uninit, NULL);151152153