2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/*
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * CDDL HEADER START
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * The contents of this file are subject to the terms of the
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * Common Development and Distribution License (the "License").
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * You may not use this file except in compliance with the License.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * or http://www.opensolaris.org/os/licensing.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * See the License for the specific language governing permissions
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * and limitations under the License.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * When distributing Covered Code, include this CDDL HEADER in each
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * If applicable, add the following below this CDDL HEADER, with the
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * fields enclosed by brackets "[]" replaced with your own identifying
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * information: Portions Copyright [yyyy] [name of copyright owner]
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * CDDL HEADER END
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/*
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * Use is subject to license terms.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#ifndef _INET_IPTUN_IMPL_H
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define _INET_IPTUN_IMPL_H
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/sunddi.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/sunldi.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/stream.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/modhash.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/list.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/dls.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/mac.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/dld_impl.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/netstack.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/sunddi.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/sunldi.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <sys/socket.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <inet/iptun.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <inet/ipclassifier.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <inet/ipsec_impl.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <netinet/in.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#ifdef __cplusplus
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern "C" {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#endif
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#ifdef _KERNEL
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_MODID 5134
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_DRIVER_NAME "iptun"
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_encaplim_s {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ip6_dest_t iel_destopt;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy struct ip6_opt_tunnel iel_telopt;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint8_t iel_padn[3];
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_encaplim_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_ipv6hdrs_s {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ip6_t it6h_ip6h;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_encaplim_t it6h_encaplim;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_ipv6hdrs_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef union iptun_header_u {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ipha_t ihu_hdr4;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_ipv6hdrs_t ihu_hdr6;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_header_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_addr_s {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy sa_family_t ia_family;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy union {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ipaddr_t iau_addr4;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy in6_addr_t iau_addr6;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy } ia_addr;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_addr_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_typeinfo {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_type_t iti_type;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy const char *iti_ident; /* MAC-Type plugin identifier */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint_t iti_ipvers; /* outer header IP version */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint32_t iti_minmtu; /* minimum possible tunnel MTU */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint32_t iti_maxmtu; /* maximum possible tunnel MTU */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy boolean_t iti_hasraddr; /* has a remote adress */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_typeinfo_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/*
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * An iptun_t represents an IP tunnel link. The iptun_lock protects the
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * integrity of all fields except statistics which are updated atomically, and
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * is also used by iptun_upcall_cv and iptun_enter_cv. Access to all fields
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * must be done under the protection of iptun_lock with the following
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * exceptions:
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * The datapath reads certain fields without locks for performance reasons.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy *
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * - IPTUN_IS_RUNNING() is used (read access to iptun_flags IPTUN_BOUND and
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * IPTUN_MAC_STARTED) to drop packets if they're sent while the tunnel is
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * not running. This is harmless as the worst case scenario is that a
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * packet will be needlessly sent down to ip and be dropped due to an
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * unspecified source or destination.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_s {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy datalink_id_t iptun_linkid;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy kmutex_t iptun_lock;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy kcondvar_t iptun_upcall_cv;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy kcondvar_t iptun_enter_cv;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint32_t iptun_flags;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy list_node_t iptun_link;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy mac_handle_t iptun_mh;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy conn_t *iptun_connp;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy zoneid_t iptun_zoneid;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy netstack_t *iptun_ns;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy struct ipsec_tun_pol_s *iptun_itp;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_typeinfo_t *iptun_typeinfo;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint32_t iptun_mtu;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint32_t iptun_dpmtu; /* destination path MTU */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint8_t iptun_hoplimit;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint8_t iptun_encaplimit;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_addr_t iptun_laddr; /* local address */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_addr_t iptun_raddr; /* remote address */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy iptun_header_t iptun_header;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy size_t iptun_header_size;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ipsec_req_t iptun_simple_policy;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy /* statistics */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_ierrors;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_oerrors;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_rbytes;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_obytes;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_ipackets;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_opackets;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_norcvbuf;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_noxmtbuf;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy uint64_t iptun_taskq_fail;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_iptuns iptun_ns->netstack_iptun
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_laddr4 iptun_laddr.ia_addr.iau_addr4
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_laddr6 iptun_laddr.ia_addr.iau_addr6
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_raddr4 iptun_raddr.ia_addr.iau_addr4
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_raddr6 iptun_raddr.ia_addr.iau_addr6
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_header4 iptun_header.ihu_hdr4
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define iptun_header6 iptun_header.ihu_hdr6
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/* iptun_flags */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_BOUND 0x0001 /* tunnel address(es) bound with ip */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_LADDR 0x0002 /* local address is set */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_RADDR 0x0004 /* remote address is set */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_MAC_REGISTERED 0x0008 /* registered with the mac module */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_MAC_STARTED 0x0010 /* iptun_m_start() has been called */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_HASH_INSERTED 0x0020 /* iptun_t in iptun_hash */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_FIXED_MTU 0x0040 /* MTU was set using mtu link prop */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_IMPLICIT 0x0080 /* implicitly created IP tunnel */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_SIMPLE_POLICY 0x0100 /* cached iptun_simple_policy */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_UPCALL_PENDING 0x0200 /* upcall to mac module in progress */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_DELETE_PENDING 0x0400 /* iptun_delete() is issuing upcalls */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IPTUN_CONDEMNED 0x0800 /* iptun_t is to be freed */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#define IS_IPTUN_RUNNING(iptun) \
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ((iptun->iptun_flags & (IPTUN_BOUND | IPTUN_MAC_STARTED)) == \
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (IPTUN_BOUND | IPTUN_MAC_STARTED))
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/*
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark * iptuns_lock protects iptuns_iptunlist.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roytypedef struct iptun_stack {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy netstack_t *iptuns_netstack; /* Common netstack */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy kmutex_t iptuns_lock;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy list_t iptuns_iptunlist; /* list of tunnels in this stack. */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy ipaddr_t iptuns_relay_rtr_addr;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy} iptun_stack_t;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern dev_info_t *iptun_dip;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern mod_hash_t *iptun_hash;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern kmem_cache_t *iptun_cache;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern ddi_taskq_t *iptun_taskq;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern ldi_ident_t iptun_ldi_ident;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_ioc_init(void);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern void iptun_ioc_fini(void);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern uint_t iptun_count(void);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_create(iptun_kparams_t *, cred_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_delete(datalink_id_t, cred_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_modify(const iptun_kparams_t *, cred_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_info(iptun_kparams_t *, cred_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern int iptun_set_6to4relay(netstack_t *, ipaddr_t);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern void iptun_get_6to4relay(netstack_t *, ipaddr_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Royextern void iptun_set_policy(datalink_id_t, ipsec_tun_pol_t *);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#endif /* _KERNEL */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#ifdef __cplusplus
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy}
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#endif
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#endif /* _INET_IPTUN_IMPL_H */