Signed-off-by: Alexandra Rukomoinikova <[email protected]>
Acked-by: Lorenzo Bianconi <[email protected]>
---
v2 --> v3: added Acked-by
---
 northd/northd.c | 96 +++++++++++++++++++------------------------------
 1 file changed, 37 insertions(+), 59 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 3bd1f6849..074e7ea7e 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -10755,6 +10755,41 @@ build_lswitch_ip_mcast_igmp_mld(struct ovn_igmp_group 
*igmp_group,
                   90, ds_cstr(match), ds_cstr(actions), lflow_ref);
 }
 
+static void
+add_lrp_chassis_resident_check(struct ovn_port *op,
+                               struct ds *match)
+{
+    bool add_chassis_resident_check = false;
+    const char *json_key;
+
+    if (lrp_is_l3dgw(op)) {
+        /* The peer of this port represents a distributed
+         * gateway port. The destination lookup flow for the
+         * router's distributed gateway port MAC address should
+         * only be programmed on the gateway chassis. */
+        add_chassis_resident_check = true;
+        json_key = op->cr_port->json_key;
+    } else {
+        /* Check if the option 'reside-on-redirect-chassis'
+         * is set to true on the peer port. If set to true
+         * and if the logical switch has a localnet port, it
+         * means the router pipeline for the packets from
+         * this logical switch should be run on the chassis
+         * hosting the gateway port.
+         */
+        add_chassis_resident_check = smap_get_bool(
+            &op->nbrp->options,
+            "reside-on-redirect-chassis", false) &&
+            vector_len(&op->od->l3dgw_ports) == 1;
+        json_key = vector_get(&op->od->l3dgw_ports, 0,
+                              struct ovn_port *)->cr_port->json_key;
+    }
+
+    if (add_chassis_resident_check) {
+        ds_put_format(match, " && is_chassis_resident(%s)", json_key);
+    }
+}
+
 /* Ingress table 25: Destination lookup, unicast handling (priority 50), */
 static void
 build_lswitch_ip_unicast_lookup(struct ovn_port *op,
@@ -10804,34 +10839,7 @@ build_lswitch_ip_unicast_lookup(struct ovn_port *op,
 
         if (!vector_is_empty(&op->peer->od->l3dgw_ports) &&
             !vector_is_empty(&op->od->localnet_ports)) {
-            bool add_chassis_resident_check = false;
-            const char *json_key;
-            if (lrp_is_l3dgw(op->peer)) {
-                /* The peer of this port represents a distributed
-                    * gateway port. The destination lookup flow for the
-                    * router's distributed gateway port MAC address should
-                    * only be programmed on the gateway chassis. */
-                add_chassis_resident_check = true;
-                json_key = op->peer->cr_port->json_key;
-            } else {
-                /* Check if the option 'reside-on-redirect-chassis'
-                 * is set to true on the peer port. If set to true
-                 * and if the logical switch has a localnet port, it
-                 * means the router pipeline for the packets from
-                 * this logical switch should be run on the chassis
-                 * hosting the gateway port.
-                 */
-                add_chassis_resident_check = smap_get_bool(
-                    &op->peer->nbrp->options,
-                    "reside-on-redirect-chassis", false) &&
-                    vector_len(&op->peer->od->l3dgw_ports) == 1;
-                json_key = vector_get(&op->peer->od->l3dgw_ports, 0,
-                                      struct ovn_port *)->cr_port->json_key;
-            }
-
-            if (add_chassis_resident_check) {
-                ds_put_format(match, " && is_chassis_resident(%s)", json_key);
-            }
+            add_lrp_chassis_resident_check(op->peer, match);
         } else if (op->cr_port) {
             /* If the op has a chassis resident port, it means
              *   - its peer is a distributed gateway port (DGP) and
@@ -16492,37 +16500,7 @@ build_lrouter_ipv4_ip_input(struct ovn_port *op,
 
         if (!vector_is_empty(&op->od->l3dgw_ports) && op->peer
             && !vector_is_empty(&op->peer->od->localnet_ports)) {
-            bool add_chassis_resident_check = false;
-            const char *json_key;
-            if (lrp_is_l3dgw(op)) {
-                /* Traffic with eth.src = l3dgw_port->lrp_networks.ea_s
-                 * should only be sent from the gateway chassis, so that
-                 * upstream MAC learning points to the gateway chassis.
-                 * Also need to avoid generation of multiple ARP responses
-                 * from different chassis. */
-                add_chassis_resident_check = true;
-                json_key = op->cr_port->json_key;
-            } else {
-                /* Check if the option 'reside-on-redirect-chassis'
-                 * is set to true on the router port. If set to true
-                 * and if peer's logical switch has a localnet port, it
-                 * means the router pipeline for the packets from
-                 * peer's logical switch is be run on the chassis
-                 * hosting the gateway port and it should reply to the
-                 * ARP requests for the router port IPs.
-                 */
-                add_chassis_resident_check = smap_get_bool(
-                    &op->nbrp->options,
-                    "reside-on-redirect-chassis", false) &&
-                    vector_len(&op->od->l3dgw_ports) == 1;
-                json_key = vector_get(&op->od->l3dgw_ports, 0,
-                                      struct ovn_port *)->cr_port->json_key;
-            }
-
-            if (add_chassis_resident_check) {
-                ds_put_format(match, " && is_chassis_resident(%s)",
-                              json_key);
-            }
+            add_lrp_chassis_resident_check(op, match);
         }
 
         build_lrouter_arp_flow(op->od, op,
-- 
2.48.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to