OSDN Git Service

vxlan: avoid checking socket multiple times.
authorpravin shelar <pshelar@ovn.org>
Mon, 14 Nov 2016 04:43:53 +0000 (20:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Nov 2016 17:16:13 +0000 (12:16 -0500)
Check the vxlan socket in vxlan6_getroute().

Signed-off-by: Pravin B Shelar <pshelar@ovn.org>
Acked-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index 7bebce1..7730b33 100644 (file)
@@ -1832,6 +1832,7 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan,
 
 #if IS_ENABLED(CONFIG_IPV6)
 static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
+                                         struct vxlan_sock *sock6,
                                          struct sk_buff *skb, int oif, u8 tos,
                                          __be32 label,
                                          const struct in6_addr *daddr,
@@ -1839,7 +1840,6 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
                                          struct dst_cache *dst_cache,
                                          const struct ip_tunnel_info *info)
 {
-       struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
        bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
        struct dst_entry *ndst;
        struct flowi6 fl6;
@@ -2071,11 +2071,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                struct dst_entry *ndst;
                u32 rt6i_flags;
 
-               if (!sock6)
-                       goto drop;
-               sk = sock6->sock->sk;
-
-               ndst = vxlan6_get_route(vxlan, skb,
+               ndst = vxlan6_get_route(vxlan, sock6, skb,
                                        rdst ? rdst->remote_ifindex : 0, tos,
                                        label, &dst->sin6.sin6_addr,
                                        &src->sin6.sin6_addr,
@@ -2095,6 +2091,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                        goto tx_error;
                }
 
+               sk = sock6->sock->sk;
                /* Bypass encapsulation if the destination is local */
                rt6i_flags = ((struct rt6_info *)ndst)->rt6i_flags;
                if (!info && rt6i_flags & RTF_LOCAL &&
@@ -2434,9 +2431,10 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
                ip_rt_put(rt);
        } else {
 #if IS_ENABLED(CONFIG_IPV6)
+               struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
                struct dst_entry *ndst;
 
-               ndst = vxlan6_get_route(vxlan, skb, 0, info->key.tos,
+               ndst = vxlan6_get_route(vxlan, sock6, skb, 0, info->key.tos,
                                        info->key.label, &info->key.u.ipv6.dst,
                                        &info->key.u.ipv6.src, NULL, info);
                if (IS_ERR(ndst))