diff options
Diffstat (limited to 'include/net/ipip.h')
| -rw-r--r-- | include/net/ipip.h | 40 | 
1 files changed, 21 insertions, 19 deletions
| diff --git a/include/net/ipip.h b/include/net/ipip.h index ddc077c51f32..21947cf4fa46 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h @@ -48,25 +48,27 @@ struct ip_tunnel_prl_entry {  	struct rcu_head			rcu_head;  }; -#define __IPTUNNEL_XMIT(stats1, stats2) do {				\ -	int err;							\ -	int pkt_len = skb->len - skb_transport_offset(skb);		\ -									\ -	skb->ip_summed = CHECKSUM_NONE;					\ -	ip_select_ident(iph, &rt->dst, NULL);				\ -									\ -	err = ip_local_out(skb);					\ -	if (likely(net_xmit_eval(err) == 0)) {				\ -		u64_stats_update_begin(&(stats1)->syncp);		\ -		(stats1)->tx_bytes += pkt_len;				\ -		(stats1)->tx_packets++;					\ -		u64_stats_update_end(&(stats1)->syncp);			\ -	} else {							\ -		(stats2)->tx_errors++;					\ -		(stats2)->tx_aborted_errors++;				\ -	}								\ -} while (0) +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); -#define IPTUNNEL_XMIT() __IPTUNNEL_XMIT(txq, stats) +	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++; +	} +}  #endif |