Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / net / ipv6 / ip6_vti.c
index bcda14d..16a7e81 100644 (file)
@@ -287,8 +287,8 @@ static int vti6_rcv(struct sk_buff *skb)
        const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
 
        rcu_read_lock();
-       if ((t = vti6_tnl_lookup(dev_net(skb->dev), &ipv6h->saddr,
-                                &ipv6h->daddr)) != NULL) {
+       t = vti6_tnl_lookup(dev_net(skb->dev), &ipv6h->saddr, &ipv6h->daddr);
+       if (t != NULL) {
                if (t->parms.proto != IPPROTO_IPV6 && t->parms.proto != 0) {
                        rcu_read_unlock();
                        goto discard;
@@ -412,6 +412,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
        struct net_device_stats *stats = &t->dev->stats;
        struct dst_entry *dst = skb_dst(skb);
        struct net_device *tdev;
+       struct xfrm_state *x;
        int err = -1;
 
        if (!dst)
@@ -425,7 +426,12 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
                goto tx_err_link_failure;
        }
 
-       if (!vti6_state_check(dst->xfrm, &t->parms.raddr, &t->parms.laddr))
+       x = dst->xfrm;
+       if (!vti6_state_check(x, &t->parms.raddr, &t->parms.laddr))
+               goto tx_err_link_failure;
+
+       if (!ip6_tnl_xmit_ctl(t, (const struct in6_addr *)&x->props.saddr,
+                             (const struct in6_addr *)&x->id.daddr))
                goto tx_err_link_failure;
 
        tdev = dst->dev;
@@ -480,7 +486,7 @@ vti6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
                ipv6h = ipv6_hdr(skb);
 
                if ((t->parms.proto != IPPROTO_IPV6 && t->parms.proto != 0) ||
-                   !ip6_tnl_xmit_ctl(t) || vti6_addr_conflict(t, ipv6h))
+                   vti6_addr_conflict(t, ipv6h))
                        goto tx_err;
 
                xfrm_decode_session(skb, &fl, AF_INET6);