mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
c439cb2e4b
Most callers of the LOCAL_OUT chain will set the IP packet length and header checksum before doing so. They also share the same output function dst_output. This patch creates a new function called ip_local_out which does all of that and converts the appropriate users over to it. Apart from removing duplicate code, it will also help in merging the IPsec output path once the same thing is done for IPv6. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
47 lines
1.1 KiB
C
47 lines
1.1 KiB
C
#ifndef __NET_IPIP_H
|
|
#define __NET_IPIP_H 1
|
|
|
|
#include <linux/if_tunnel.h>
|
|
#include <net/ip.h>
|
|
|
|
/* Keep error state on tunnel for 30 sec */
|
|
#define IPTUNNEL_ERR_TIMEO (30*HZ)
|
|
|
|
struct ip_tunnel
|
|
{
|
|
struct ip_tunnel *next;
|
|
struct net_device *dev;
|
|
struct net_device_stats stat;
|
|
|
|
int recursion; /* Depth of hard_start_xmit recursion */
|
|
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;
|
|
};
|
|
|
|
#define IPTUNNEL_XMIT() do { \
|
|
int err; \
|
|
int pkt_len = skb->len; \
|
|
\
|
|
skb->ip_summed = CHECKSUM_NONE; \
|
|
ip_select_ident(iph, &rt->u.dst, NULL); \
|
|
\
|
|
err = ip_local_out(skb); \
|
|
if (net_xmit_eval(err) == 0) { \
|
|
stats->tx_bytes += pkt_len; \
|
|
stats->tx_packets++; \
|
|
} else { \
|
|
stats->tx_errors++; \
|
|
stats->tx_aborted_errors++; \
|
|
} \
|
|
} while (0)
|
|
|
|
#endif
|