]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mpls/mpls_iptunnel.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / net / mpls / mpls_iptunnel.c
index 2f7ccd93441671d6aac3fd690cfc61283848579a..67b7a955de65abac3604cf93c7f8e672820b4539 100644 (file)
@@ -48,11 +48,15 @@ static int mpls_xmit(struct sk_buff *skb)
        struct dst_entry *dst = skb_dst(skb);
        struct rtable *rt = NULL;
        struct rt6_info *rt6 = NULL;
+       struct mpls_dev *out_mdev;
        int err = 0;
        bool bos;
        int i;
        unsigned int ttl;
 
+       /* Find the output device */
+       out_dev = dst->dev;
+
        /* Obtain the ttl */
        if (dst->ops->family == AF_INET) {
                ttl = ip_hdr(skb)->ttl;
@@ -66,8 +70,6 @@ static int mpls_xmit(struct sk_buff *skb)
 
        skb_orphan(skb);
 
-       /* Find the output device */
-       out_dev = dst->dev;
        if (!mpls_output_possible(out_dev) ||
            !dst->lwtstate || skb_warn_if_lro(skb))
                goto drop;
@@ -109,6 +111,8 @@ static int mpls_xmit(struct sk_buff *skb)
                bos = false;
        }
 
+       mpls_stats_inc_outucastpkts(out_dev, skb);
+
        if (rt)
                err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt->rt_gateway,
                                 skb);
@@ -122,6 +126,9 @@ static int mpls_xmit(struct sk_buff *skb)
        return LWTUNNEL_XMIT_DONE;
 
 drop:
+       out_mdev = out_dev ? mpls_dev_get(out_dev) : NULL;
+       if (out_mdev)
+               MPLS_INC_STATS(out_mdev, tx_errors);
        kfree_skb(skb);
        return -EINVAL;
 }
@@ -215,6 +222,7 @@ static const struct lwtunnel_encap_ops mpls_iptun_ops = {
        .fill_encap = mpls_fill_encap_info,
        .get_encap_size = mpls_encap_nlsize,
        .cmp_encap = mpls_encap_cmp,
+       .owner = THIS_MODULE,
 };
 
 static int __init mpls_iptunnel_init(void)