#ifndef _INET_IPTUN_IMPL_H
#define _INET_IPTUN_IMPL_H
#include <sys/sunddi.h>
#include <sys/sunldi.h>
#include <sys/stream.h>
#include <sys/modhash.h>
#include <sys/list.h>
#include <sys/dls.h>
#include <sys/mac.h>
#include <sys/dld_impl.h>
#include <sys/netstack.h>
#include <sys/sunddi.h>
#include <sys/sunldi.h>
#include <sys/socket.h>
#include <inet/iptun.h>
#include <inet/ipclassifier.h>
#include <inet/ipsec_impl.h>
#include <netinet/in.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#define IPTUN_MODID 5134
#define IPTUN_DRIVER_NAME "iptun"
typedef struct iptun_encaplim_s {
ip6_dest_t iel_destopt;
struct ip6_opt_tunnel iel_telopt;
uint8_t iel_padn[3];
} iptun_encaplim_t;
typedef struct iptun_ipv6hdrs_s {
ip6_t it6h_ip6h;
iptun_encaplim_t it6h_encaplim;
} iptun_ipv6hdrs_t;
typedef union iptun_header_u {
ipha_t ihu_hdr4;
iptun_ipv6hdrs_t ihu_hdr6;
} iptun_header_t;
typedef struct iptun_addr_s {
sa_family_t ia_family;
union {
ipaddr_t iau_addr4;
in6_addr_t iau_addr6;
} ia_addr;
} iptun_addr_t;
typedef struct iptun_typeinfo {
iptun_type_t iti_type;
const char *iti_ident;
uint_t iti_ipvers;
uint32_t iti_minmtu;
uint32_t iti_maxmtu;
boolean_t iti_hasraddr;
} iptun_typeinfo_t;
typedef struct iptun_s {
datalink_id_t iptun_linkid;
kmutex_t iptun_lock;
kcondvar_t iptun_upcall_cv;
kcondvar_t iptun_enter_cv;
uint32_t iptun_flags;
list_node_t iptun_link;
mac_handle_t iptun_mh;
conn_t *iptun_connp;
zoneid_t iptun_zoneid;
netstack_t *iptun_ns;
struct ipsec_tun_pol_s *iptun_itp;
iptun_typeinfo_t *iptun_typeinfo;
uint32_t iptun_mtu;
uint32_t iptun_dpmtu;
uint8_t iptun_hoplimit;
uint8_t iptun_encaplimit;
iptun_addr_t iptun_laddr;
iptun_addr_t iptun_raddr;
iptun_header_t iptun_header;
size_t iptun_header_size;
ipsec_req_t iptun_simple_policy;
uint64_t iptun_ierrors;
uint64_t iptun_oerrors;
uint64_t iptun_rbytes;
uint64_t iptun_obytes;
uint64_t iptun_ipackets;
uint64_t iptun_opackets;
uint64_t iptun_norcvbuf;
uint64_t iptun_noxmtbuf;
uint64_t iptun_taskq_fail;
} iptun_t;
#define iptun_iptuns iptun_ns->netstack_iptun
#define iptun_laddr4 iptun_laddr.ia_addr.iau_addr4
#define iptun_laddr6 iptun_laddr.ia_addr.iau_addr6
#define iptun_raddr4 iptun_raddr.ia_addr.iau_addr4
#define iptun_raddr6 iptun_raddr.ia_addr.iau_addr6
#define iptun_header4 iptun_header.ihu_hdr4
#define iptun_header6 iptun_header.ihu_hdr6
#define IPTUN_BOUND 0x0001
#define IPTUN_LADDR 0x0002
#define IPTUN_RADDR 0x0004
#define IPTUN_MAC_REGISTERED 0x0008
#define IPTUN_MAC_STARTED 0x0010
#define IPTUN_HASH_INSERTED 0x0020
#define IPTUN_FIXED_MTU 0x0040
#define IPTUN_IMPLICIT 0x0080
#define IPTUN_SIMPLE_POLICY 0x0100
#define IPTUN_UPCALL_PENDING 0x0200
#define IPTUN_DELETE_PENDING 0x0400
#define IPTUN_CONDEMNED 0x0800
#define IS_IPTUN_RUNNING(iptun) \
((iptun->iptun_flags & (IPTUN_BOUND | IPTUN_MAC_STARTED)) == \
(IPTUN_BOUND | IPTUN_MAC_STARTED))
typedef struct iptun_stack {
netstack_t *iptuns_netstack;
kmutex_t iptuns_lock;
list_t iptuns_iptunlist;
ipaddr_t iptuns_relay_rtr_addr;
} iptun_stack_t;
extern dev_info_t *iptun_dip;
extern mod_hash_t *iptun_hash;
extern kmem_cache_t *iptun_cache;
extern ddi_taskq_t *iptun_taskq;
extern ldi_ident_t iptun_ldi_ident;
extern int iptun_ioc_init(void);
extern void iptun_ioc_fini(void);
extern uint_t iptun_count(void);
extern int iptun_create(iptun_kparams_t *, cred_t *);
extern int iptun_delete(datalink_id_t, cred_t *);
extern int iptun_modify(const iptun_kparams_t *, cred_t *);
extern int iptun_info(iptun_kparams_t *, cred_t *);
extern int iptun_set_6to4relay(netstack_t *, ipaddr_t);
extern void iptun_get_6to4relay(netstack_t *, ipaddr_t *);
extern void iptun_set_policy(datalink_id_t, ipsec_tun_pol_t *);
#endif
#ifdef __cplusplus
}
#endif
#endif