vxlan: treat vni in metadata based tunnels consistently
authorJiri Benc <jbenc@redhat.com>
Tue, 16 Feb 2016 20:59:03 +0000 (21:59 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Feb 2016 04:52:12 +0000 (23:52 -0500)
For metadata based tunnels, VNI is ignored when doing vxlan device lookups
(because such tunnel receives all VNIs). However, this was not honored by
vxlan_xmit_one when doing encapsulation bypass. Move the check for metadata
based tunnel to the common place where it belongs.

Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index dfbb3cb..3a84680 100644 (file)
@@ -246,6 +246,10 @@ static struct vxlan_dev *vxlan_vs_find_vni(struct vxlan_sock *vs, __be32 vni)
 {
        struct vxlan_dev *vxlan;
 
+       /* For flow based devices, map all packets to VNI 0 */
+       if (vs->flags & VXLAN_F_COLLECT_METADATA)
+               vni = 0;
+
        hlist_for_each_entry_rcu(vxlan, vni_head(vs, vni), hlist) {
                if (vxlan->default_dst.remote_vni == vni)
                        return vxlan;
@@ -1194,10 +1198,6 @@ static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb,
        union vxlan_addr saddr;
        int err = 0;
 
-       /* For flow based devices, map all packets to VNI 0 */
-       if (vs->flags & VXLAN_F_COLLECT_METADATA)
-               vni = 0;
-
        /* Is this VNI defined? */
        vxlan = vxlan_vs_find_vni(vs, vni);
        if (!vxlan)