2005-04-17 02:20:36 +04:00
# ifndef _NET_IP6_TUNNEL_H
# define _NET_IP6_TUNNEL_H
# include <linux/ipv6.h>
# include <linux/netdevice.h>
2013-03-25 18:49:35 +04:00
# include <linux/if_tunnel.h>
2005-04-17 02:20:36 +04:00
# include <linux/ip6_tunnel.h>
2012-08-10 04:51:50 +04:00
# define IP6TUNNEL_ERR_TIMEO (30*HZ)
2005-04-17 02:20:36 +04:00
/* capable of sending packets */
# define IP6_TNL_F_CAP_XMIT 0x10000
/* capable of receiving packets */
# define IP6_TNL_F_CAP_RCV 0x20000
2012-06-28 22:15:52 +04:00
/* determine capability on a per-packet basis */
# define IP6_TNL_F_CAP_PER_PACKET 0x40000
2005-04-17 02:20:36 +04:00
2012-08-10 04:51:50 +04:00
struct __ip6_tnl_parm {
char name [ IFNAMSIZ ] ; /* name of tunnel device */
int link ; /* ifindex of underlying L2 interface */
__u8 proto ; /* tunnel protocol */
__u8 encap_limit ; /* encapsulation limit for tunnel */
__u8 hop_limit ; /* hop limit for tunnel */
__be32 flowinfo ; /* traffic class and flowlabel for tunnel */
__u32 flags ; /* tunnel flags */
struct in6_addr laddr ; /* local tunnel end-point address */
struct in6_addr raddr ; /* remote tunnel end-point address */
__be16 i_flags ;
__be16 o_flags ;
__be32 i_key ;
__be32 o_key ;
} ;
2005-04-17 02:20:36 +04:00
2012-08-10 04:51:50 +04:00
/* IPv6 tunnel */
2005-04-17 02:20:36 +04:00
struct ip6_tnl {
2010-10-25 01:33:16 +04:00
struct ip6_tnl __rcu * next ; /* next tunnel in list */
2005-04-17 02:20:36 +04:00
struct net_device * dev ; /* virtual device associated with tunnel */
2013-08-13 19:51:12 +04:00
struct net * net ; /* netns for packet i/o */
2012-08-10 04:51:50 +04:00
struct __ip6_tnl_parm parms ; /* tunnel configuration parameters */
2005-04-17 02:20:36 +04:00
struct flowi fl ; /* flowi template for xmit */
struct dst_entry * dst_cache ; /* cached dst */
u32 dst_cookie ;
2012-08-10 04:51:50 +04:00
int err_count ;
unsigned long err_time ;
/* These fields used only by GRE */
__u32 i_seqno ; /* The last seen seqno */
__u32 o_seqno ; /* The last output seqno */
int hlen ; /* Precalculated GRE header length */
int mlink ;
2005-04-17 02:20:36 +04:00
} ;
/* Tunnel encapsulation limit destination sub-option */
struct ipv6_tlv_tnl_enc_lim {
__u8 type ; /* type-code for option */
__u8 length ; /* option length */
__u8 encap_limit ; /* tunnel encapsulation limit */
2010-06-03 14:21:52 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
2012-08-10 04:51:50 +04:00
struct dst_entry * ip6_tnl_dst_check ( struct ip6_tnl * t ) ;
void ip6_tnl_dst_reset ( struct ip6_tnl * t ) ;
void ip6_tnl_dst_store ( struct ip6_tnl * t , struct dst_entry * dst ) ;
int ip6_tnl_rcv_ctl ( struct ip6_tnl * t , const struct in6_addr * laddr ,
const struct in6_addr * raddr ) ;
2014-11-05 10:02:48 +03:00
int ip6_tnl_xmit_ctl ( struct ip6_tnl * t , const struct in6_addr * laddr ,
const struct in6_addr * raddr ) ;
2012-08-10 04:51:50 +04:00
__u16 ip6_tnl_parse_tlv_enc_lim ( struct sk_buff * skb , __u8 * raw ) ;
__u32 ip6_tnl_get_cap ( struct ip6_tnl * t , const struct in6_addr * laddr ,
const struct in6_addr * raddr ) ;
2013-03-10 03:00:39 +04:00
static inline void ip6tunnel_xmit ( struct sk_buff * skb , struct net_device * dev )
{
struct net_device_stats * stats = & dev - > stats ;
int pkt_len , err ;
pkt_len = skb - > len ;
err = ip6_local_out ( skb ) ;
if ( net_xmit_eval ( err ) = = 0 ) {
2014-01-04 09:57:59 +04:00
struct pcpu_sw_netstats * tstats = this_cpu_ptr ( dev - > tstats ) ;
2013-03-10 03:00:39 +04:00
u64_stats_update_begin ( & tstats - > syncp ) ;
tstats - > tx_bytes + = pkt_len ;
tstats - > tx_packets + + ;
u64_stats_update_end ( & tstats - > syncp ) ;
} else {
stats - > tx_errors + + ;
stats - > tx_aborted_errors + + ;
}
}
2005-04-17 02:20:36 +04:00
# endif