In tnl_set_config(), when determining if a tunnel port
already exists, make sure to also check the destination port. For VXLAN, this
can be different and allows multiple VXLAN ports in the datapath to be
created.

Signed-off-by: Kyle Mestery <kmest...@cisco.com>
---
 datapath/tunnel.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/datapath/tunnel.c b/datapath/tunnel.c
index 7c2560f..6e6f18e 100644
--- a/datapath/tunnel.c
+++ b/datapath/tunnel.c
@@ -48,6 +48,7 @@
 #include "datapath.h"
 #include "tunnel.h"
 #include "vlan.h"
+#include "tunnel.h"
 #include "vport.h"
 #include "vport-internal_dev.h"
 
@@ -707,6 +708,7 @@ static int tnl_set_config(struct net *net, struct nlattr 
*options,
                          struct tnl_mutable_config *mutable)
 {
        const struct vport *old_vport;
+       const struct tnl_vport *old_tnl_vport;
        const struct tnl_mutable_config *old_mutable;
        struct nlattr *a[OVS_TUNNEL_ATTR_MAX + 1];
        int err;
@@ -786,8 +788,20 @@ static int tnl_set_config(struct net *net, struct nlattr 
*options,
 
 out:
        old_vport = port_table_lookup(&mutable->key, &old_mutable);
-       if (old_vport && old_vport != cur_vport)
-               return -EEXIST;
+       if (old_vport) {
+               old_tnl_vport = tnl_vport_priv(old_vport);
+               if (old_tnl_vport) {
+                       struct tnl_mutable_config *tmutable;
+
+                       tmutable = rcu_dereference_rtnl(old_tnl_vport->mutable);
+                       if (old_vport == cur_vport &&
+                           mutable->dst_port == tmutable->dst_port)
+                               return -EEXIST;
+               } else {
+                       if (old_vport != cur_vport)
+                               return -EEXIST;
+               }
+       }
 
        return 0;
 }
-- 
1.8.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to