2005-04-16 15:20:36 -07:00
# ifndef __NET_IPIP_H
# define __NET_IPIP_H 1
# include <linux/if_tunnel.h>
2012-09-27 02:48:50 +00:00
# include <net/gro_cells.h>
2008-01-11 19:14:00 -08:00
# include <net/ip.h>
2005-04-16 15:20:36 -07:00
/* Keep error state on tunnel for 30 sec */
# define IPTUNNEL_ERR_TIMEO (30*HZ)
2009-09-22 23:43:14 +00:00
/* 6rd prefix/relay information */
2009-11-03 03:26:03 +00:00
struct ip_tunnel_6rd_parm {
2009-09-22 23:43:14 +00:00
struct in6_addr prefix ;
__be32 relay_prefix ;
u16 prefixlen ;
u16 relay_prefixlen ;
} ;
2009-11-03 03:26:03 +00:00
struct ip_tunnel {
2010-10-24 21:33:16 +00:00
struct ip_tunnel __rcu * next ;
2005-04-16 15:20:36 -07:00
struct net_device * dev ;
int err_count ; /* Number of arrived ICMP errors */
unsigned long err_time ; /* Time when the last ICMP error arrived */
/* These four 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 ;
struct ip_tunnel_parm parms ;
2008-03-24 18:28:39 +09:00
2009-09-22 23:43:14 +00:00
/* for SIT */
# ifdef CONFIG_IPV6_SIT_6RD
struct ip_tunnel_6rd_parm ip6rd ;
# endif
2010-10-25 21:01:26 +00:00
struct ip_tunnel_prl_entry __rcu * prl ; /* potential router list */
2008-03-24 18:28:39 +09:00
unsigned int prl_count ; /* # of entries in PRL */
2012-09-27 02:48:50 +00:00
struct gro_cells gro_cells ;
2008-03-11 18:35:59 -04:00
} ;
2009-11-03 03:26:03 +00:00
struct ip_tunnel_prl_entry {
2010-10-25 21:01:26 +00:00
struct ip_tunnel_prl_entry __rcu * next ;
2008-03-24 18:28:39 +09:00
__be32 addr ;
u16 flags ;
2009-10-23 17:51:26 +00:00
struct rcu_head rcu_head ;
2005-04-16 15:20:36 -07:00
} ;
2012-11-11 21:52:33 +00:00
static inline void iptunnel_xmit ( struct sk_buff * skb , struct net_device * dev )
{
int err ;
struct iphdr * iph = ip_hdr ( skb ) ;
int pkt_len = skb - > len - skb_transport_offset ( skb ) ;
struct pcpu_tstats * tstats = this_cpu_ptr ( dev - > tstats ) ;
2005-04-16 15:20:36 -07:00
2012-11-11 21:52:33 +00:00
nf_reset ( skb ) ;
skb - > ip_summed = CHECKSUM_NONE ;
ip_select_ident ( iph , skb_dst ( skb ) , NULL ) ;
err = ip_local_out ( skb ) ;
if ( likely ( net_xmit_eval ( err ) = = 0 ) ) {
u64_stats_update_begin ( & tstats - > syncp ) ;
tstats - > tx_bytes + = pkt_len ;
tstats - > tx_packets + + ;
u64_stats_update_end ( & tstats - > syncp ) ;
} else {
dev - > stats . tx_errors + + ;
dev - > stats . tx_aborted_errors + + ;
}
}
2010-09-27 00:33:35 +00:00
2005-04-16 15:20:36 -07:00
# endif