11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __NET_IPIP_H
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __NET_IPIP_H 1
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/if_tunnel.h>
5c439cb2e4b13cf1cb2abcd006b906315a3381323Herbert Xu#include <net/ip.h>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Keep error state on tunnel for 30 sec */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IPTUNNEL_ERR_TIMEO	(30*HZ)
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明/* 6rd prefix/relay information */
11fd2c3ef761fbc5e6c27fa7d40b30cda06bfcd7d8Eric Dumazetstruct ip_tunnel_6rd_parm {
12fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	struct in6_addr		prefix;
13fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	__be32			relay_prefix;
14fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	u16			prefixlen;
15fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	u16			relay_prefixlen;
16fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明};
17fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明
18fd2c3ef761fbc5e6c27fa7d40b30cda06bfcd7d8Eric Dumazetstruct ip_tunnel {
196f0bcf152582e7403155627a38e07bf3ef7f3cf5Eric Dumazet	struct ip_tunnel __rcu	*next;
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct net_device	*dev;
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			err_count;	/* Number of arrived ICMP errors */
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long		err_time;	/* Time when the last ICMP error arrived */
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* These four fields used only by GRE */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u32			i_seqno;	/* The last seen seqno	*/
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u32			o_seqno;	/* The last output seqno */
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			hlen;		/* Precalculated GRE header length */
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			mlink;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct ip_tunnel_parm	parms;
32300aaeeaab5f447fcf40e911afe96df3de28f0dbYOSHIFUJI Hideaki
33fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	/* for SIT */
34fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明#ifdef CONFIG_IPV6_SIT_6RD
35fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明	struct ip_tunnel_6rd_parm	ip6rd;
36fa857afcf77da669eb6b7031ec07ad14b912c307YOSHIFUJI Hideaki / 吉藤英明#endif
37b33eab08445d86c3d0dec3111ce10df561328705Eric Dumazet	struct ip_tunnel_prl_entry __rcu *prl;		/* potential router list */
38300aaeeaab5f447fcf40e911afe96df3de28f0dbYOSHIFUJI Hideaki	unsigned int			prl_count;	/* # of entries in PRL */
39fadf6bf06069138f8e97c9a963be38348ba2708bTemplin, Fred L};
40fadf6bf06069138f8e97c9a963be38348ba2708bTemplin, Fred L
41fd2c3ef761fbc5e6c27fa7d40b30cda06bfcd7d8Eric Dumazetstruct ip_tunnel_prl_entry {
42b33eab08445d86c3d0dec3111ce10df561328705Eric Dumazet	struct ip_tunnel_prl_entry __rcu *next;
43300aaeeaab5f447fcf40e911afe96df3de28f0dbYOSHIFUJI Hideaki	__be32				addr;
44300aaeeaab5f447fcf40e911afe96df3de28f0dbYOSHIFUJI Hideaki	u16				flags;
45ef9a9d1183b36fbf3de327f44596533b770c3005Eric Dumazet	struct rcu_head			rcu_head;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet#define __IPTUNNEL_XMIT(stats1, stats2) do {				\
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err;							\
5064194c31a0b6f5d84703b772113aafc400eeaad6Herbert Xu	int pkt_len = skb->len - skb_transport_offset(skb);		\
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									\
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb->ip_summed = CHECKSUM_NONE;					\
53d8d1f30b95a635dbd610dcc5eb641aca8f4768cfChangli Gao	ip_select_ident(iph, &rt->dst, NULL);				\
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									\
55c439cb2e4b13cf1cb2abcd006b906315a3381323Herbert Xu	err = ip_local_out(skb);					\
560bfbedb14a8a96c529341bec88991a92b41fac72Eric Dumazet	if (likely(net_xmit_eval(err) == 0)) {				\
57290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet		(stats1)->tx_bytes += pkt_len;				\
58290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet		(stats1)->tx_packets++;					\
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {							\
60290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet		(stats2)->tx_errors++;					\
61290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet		(stats2)->tx_aborted_errors++;				\
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}								\
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} while (0)
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
65290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet#define IPTUNNEL_XMIT() __IPTUNNEL_XMIT(txq, stats)
66290b895e0ba4552dfcfc4bd35759c192345b934aEric Dumazet
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
68