Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 039f5062 authored by Pravin B Shelar's avatar Pravin B Shelar Committed by David S. Miller
Browse files

ip_tunnel: Move stats update to iptunnel_xmit()



By moving stats update into iptunnel_xmit(), we can simplify
iptunnel_xmit() usage. With this change there is no need to
call another function (iptunnel_xmit_stats()) to update stats
in tunnel xmit code path.

Signed-off-by: default avatarPravin B Shelar <pshelar@nicira.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d7d3e25f
Loading
Loading
Loading
Loading
+8 −9
Original line number Original line Diff line number Diff line
@@ -918,12 +918,11 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
		ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
		ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
		df = 0;
		df = 0;
	}
	}
	err = udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr,
	udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr,
			    tos, ttl, df, sport, geneve->dst_port,
			    tos, ttl, df, sport, geneve->dst_port,
			    !net_eq(geneve->net, dev_net(geneve->dev)),
			    !net_eq(geneve->net, dev_net(geneve->dev)),
			    !(flags & GENEVE_F_UDP_CSUM));
			    !(flags & GENEVE_F_UDP_CSUM));


	iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
	return NETDEV_TX_OK;
	return NETDEV_TX_OK;


tx_error:
tx_error:
@@ -1005,7 +1004,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
			ttl = 1;
			ttl = 1;
		ttl = ttl ? : ip6_dst_hoplimit(dst);
		ttl = ttl ? : ip6_dst_hoplimit(dst);
	}
	}
	err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
	udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
			     &fl6.saddr, &fl6.daddr, prio, ttl,
			     &fl6.saddr, &fl6.daddr, prio, ttl,
			     sport, geneve->dst_port,
			     sport, geneve->dst_port,
			     !!(flags & GENEVE_F_UDP_ZERO_CSUM6_TX));
			     !!(flags & GENEVE_F_UDP_ZERO_CSUM6_TX));
+4 −5
Original line number Original line Diff line number Diff line
@@ -1841,9 +1841,10 @@ static int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *sk


	skb_set_inner_protocol(skb, htons(ETH_P_TEB));
	skb_set_inner_protocol(skb, htons(ETH_P_TEB));


	return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos,
	udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
				   ttl, df, src_port, dst_port, xnet,
			    src_port, dst_port, xnet,
			    !(vxflags & VXLAN_F_UDP_CSUM));
			    !(vxflags & VXLAN_F_UDP_CSUM));
	return 0;
}
}


#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
@@ -2056,8 +2057,6 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
			skb = NULL;
			skb = NULL;
			goto rt_tx_error;
			goto rt_tx_error;
		}
		}

		iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
	} else {
	} else {
		struct dst_entry *ndst;
		struct dst_entry *ndst;
+4 −13
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@
#include <linux/netdevice.h>
#include <linux/netdevice.h>
#include <linux/if_tunnel.h>
#include <linux/if_tunnel.h>
#include <linux/ip6_tunnel.h>
#include <linux/ip6_tunnel.h>
#include <net/ip_tunnels.h>


#define IP6TUNNEL_ERR_TIMEO (30*HZ)
#define IP6TUNNEL_ERR_TIMEO (30*HZ)


@@ -83,22 +84,12 @@ int ip6_tnl_get_iflink(const struct net_device *dev);
static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
				  struct net_device *dev)
				  struct net_device *dev)
{
{
	struct net_device_stats *stats = &dev->stats;
	int pkt_len, err;
	int pkt_len, err;


	pkt_len = skb->len - skb_inner_network_offset(skb);
	pkt_len = skb->len - skb_inner_network_offset(skb);
	err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
	err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);

	if (unlikely(net_xmit_eval(err)))
	if (net_xmit_eval(err) == 0) {
		pkt_len = -1;
		struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
	iptunnel_xmit_stats(dev, pkt_len);
		u64_stats_update_begin(&tstats->syncp);
		tstats->tx_bytes += pkt_len;
		tstats->tx_packets++;
		u64_stats_update_end(&tstats->syncp);
		put_cpu_ptr(tstats);
	} else {
		stats->tx_errors++;
		stats->tx_aborted_errors++;
	}
}
}
#endif
#endif
+15 −13
Original line number Original line Diff line number Diff line
@@ -273,7 +273,7 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
}
}


int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
		   __be32 src, __be32 dst, u8 proto,
		   __be32 src, __be32 dst, u8 proto,
		   u8 tos, u8 ttl, __be16 df, bool xnet);
		   u8 tos, u8 ttl, __be16 df, bool xnet);
struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
@@ -282,25 +282,27 @@ struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum,
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum,
					 int gso_type_mask);
					 int gso_type_mask);


static inline void iptunnel_xmit_stats(int err,
static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
				       struct net_device_stats *err_stats,
				       struct pcpu_sw_netstats __percpu *stats)
{
{
	if (err > 0) {
	if (pkt_len > 0) {
		struct pcpu_sw_netstats *tstats = get_cpu_ptr(stats);
		struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);


		u64_stats_update_begin(&tstats->syncp);
		u64_stats_update_begin(&tstats->syncp);
		tstats->tx_bytes += err;
		tstats->tx_bytes += pkt_len;
		tstats->tx_packets++;
		tstats->tx_packets++;
		u64_stats_update_end(&tstats->syncp);
		u64_stats_update_end(&tstats->syncp);
		put_cpu_ptr(tstats);
		put_cpu_ptr(tstats);
	} else if (err < 0) {
	} else {
		struct net_device_stats *err_stats = &dev->stats;

		if (pkt_len < 0) {
			err_stats->tx_errors++;
			err_stats->tx_errors++;
			err_stats->tx_aborted_errors++;
			err_stats->tx_aborted_errors++;
		} else {
		} else {
			err_stats->tx_dropped++;
			err_stats->tx_dropped++;
		}
		}
	}
	}
}


static inline void *ip_tunnel_info_opts(struct ip_tunnel_info *info)
static inline void *ip_tunnel_info_opts(struct ip_tunnel_info *info)
{
{
+4 −4
Original line number Original line Diff line number Diff line
@@ -78,7 +78,7 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
			   struct udp_tunnel_sock_cfg *sock_cfg);
			   struct udp_tunnel_sock_cfg *sock_cfg);


/* Transmit the skb using UDP encapsulation. */
/* Transmit the skb using UDP encapsulation. */
int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
			 __be32 src, __be32 dst, __u8 tos, __u8 ttl,
			 __be32 src, __be32 dst, __u8 tos, __u8 ttl,
			 __be16 df, __be16 src_port, __be16 dst_port,
			 __be16 df, __be16 src_port, __be16 dst_port,
			 bool xnet, bool nocheck);
			 bool xnet, bool nocheck);
Loading