ipv6: introduce ip6tunnel_xmit() helper
authorCong Wang <xiyou.wangcong@gmail.com>
Sat, 9 Mar 2013 23:00:39 +0000 (23:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 10 Mar 2013 20:53:34 +0000 (16:53 -0400)
Similar to iptunnel_xmit(), group these operations into a
helper function.

This by the way fixes the missing u64_stats_update_begin()
and u64_stats_update_end() for 32 bit arch.

Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Pravin B Shelar <pshelar@nicira.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_tunnel.h
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c

index e03047f..ebdef7f 100644 (file)
@@ -68,4 +68,24 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw);
 __u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr,
                             const struct in6_addr *raddr);
 
+static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       struct net_device_stats *stats = &dev->stats;
+       int pkt_len, err;
+
+       nf_reset(skb);
+       pkt_len = skb->len;
+       err = ip6_local_out(skb);
+
+       if (net_xmit_eval(err) == 0) {
+               struct pcpu_tstats *tstats = this_cpu_ptr(dev->tstats);
+               u64_stats_update_begin(&tstats->syncp);
+               tstats->tx_bytes += pkt_len;
+               tstats->tx_packets++;
+               u64_stats_update_end(&tstats->syncp);
+       } else {
+               stats->tx_errors++;
+               stats->tx_aborted_errors++;
+       }
+}
 #endif
index e4efffe..6a6ba73 100644 (file)
@@ -667,7 +667,6 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
        struct net_device_stats *stats = &tunnel->dev->stats;
        int err = -1;
        u8 proto;
-       int pkt_len;
        struct sk_buff *new_skb;
 
        if (dev->type == ARPHRD_ETHER)
@@ -801,23 +800,9 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
                }
        }
 
-       nf_reset(skb);
-       pkt_len = skb->len;
-       err = ip6_local_out(skb);
-
-       if (net_xmit_eval(err) == 0) {
-               struct pcpu_tstats *tstats = this_cpu_ptr(tunnel->dev->tstats);
-
-               tstats->tx_bytes += pkt_len;
-               tstats->tx_packets++;
-       } else {
-               stats->tx_errors++;
-               stats->tx_aborted_errors++;
-       }
-
+       ip6tunnel_xmit(skb, dev);
        if (ndst)
                ip6_tnl_dst_store(tunnel, ndst);
-
        return 0;
 tx_err_link_failure:
        stats->tx_carrier_errors++;
index fff83cb..bef3fed 100644 (file)
@@ -955,7 +955,6 @@ static int ip6_tnl_xmit2(struct sk_buff *skb,
        unsigned int max_headroom = sizeof(struct ipv6hdr);
        u8 proto;
        int err = -1;
-       int pkt_len;
 
        if (!fl6->flowi6_mark)
                dst = ip6_tnl_dst_check(t);
@@ -1035,19 +1034,7 @@ static int ip6_tnl_xmit2(struct sk_buff *skb,
        ipv6h->nexthdr = proto;
        ipv6h->saddr = fl6->saddr;
        ipv6h->daddr = fl6->daddr;
-       nf_reset(skb);
-       pkt_len = skb->len;
-       err = ip6_local_out(skb);
-
-       if (net_xmit_eval(err) == 0) {
-               struct pcpu_tstats *tstats = this_cpu_ptr(t->dev->tstats);
-
-               tstats->tx_bytes += pkt_len;
-               tstats->tx_packets++;
-       } else {
-               stats->tx_errors++;
-               stats->tx_aborted_errors++;
-       }
+       ip6tunnel_xmit(skb, dev);
        if (ndst)
                ip6_tnl_dst_store(t, ndst);
        return 0;