Localnet port was supposed to work for directly connected datapath
only. However, the recursive local_datapath filling introduced a
problem in below scenario:

LS A <-> LR <-> LS B, port a@HV1 is on LS A, port b@HV2 is on LS B.
If B has localnet port, then ovn-controller on HV1 would think port
b can be reached from HV1 by localnet port on LS B, which is wrong.

This patch fixes it by adding hops information in local datapath
which can tell if a local-datapath is directly connected to the
hypervisor.

Signed-off-by: Han Zhou <zhou...@gmail.com>
Reported-by: Qianyu Wang <wang.qia...@zte.com.cn>
---
 ovn/controller/binding.c        | 1 +
 ovn/controller/ovn-controller.h | 3 +++
 ovn/controller/physical.c       | 2 +-
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/ovn/controller/binding.c b/ovn/controller/binding.c
index bb76608..03c310d 100644
--- a/ovn/controller/binding.c
+++ b/ovn/controller/binding.c
@@ -129,6 +129,7 @@ add_local_datapath__(const struct ldatapath_index 
*ldatapaths,
     ovs_assert(ld->ldatapath);
     ld->localnet_port = NULL;
     ld->has_local_l3gateway = has_local_l3gateway;
+    ld->hops = depth;
 
     if (depth >= 100) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
diff --git a/ovn/controller/ovn-controller.h b/ovn/controller/ovn-controller.h
index 4bc0467..9b85087 100644
--- a/ovn/controller/ovn-controller.h
+++ b/ovn/controller/ovn-controller.h
@@ -66,6 +66,9 @@ struct local_datapath {
     /* True if this datapath contains an l3gateway port located on this
      * hypervisor. */
     bool has_local_l3gateway;
+
+    /* Number of logical hops the datapath is connected to this hypervisor. */
+    int hops;
 };
 
 struct local_datapath *get_local_datapath(const struct hmap *,
diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c
index f2d9676..7051906 100644
--- a/ovn/controller/physical.c
+++ b/ovn/controller/physical.c
@@ -151,7 +151,7 @@ get_localnet_port(struct hmap *local_datapaths, int64_t 
tunnel_key)
 {
     struct local_datapath *ld = get_local_datapath(local_datapaths,
                                                    tunnel_key);
-    return ld ? ld->localnet_port : NULL;
+    return ld && !ld->hops ? ld->localnet_port : NULL;
 }
 
 /* Datapath zone IDs for connection tracking and NAT */
-- 
2.1.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to