diff mbox series

[ovs-dev,v5,2/9] ovn-northd: reorganize processing of lflows

Message ID 20201014162714.5978-2-anton.ivanov@cambridgegreys.com
State Superseded
Headers show
Series [ovs-dev,v5,1/9] ovn-libs: Add support for parallel processing | expand

Commit Message

Anton Ivanov Oct. 14, 2020, 4:27 p.m. UTC
From: Anton Ivanov <anton.ivanov@cambridgegreys.com>

1. Merge lrouter and lswitch processing.
2. Move lrouter and lswitch lflow generation which uses the
same iterator variables into common helpers
3. Set up structures to be used in parallel and sequential mode

Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
---
 northd/ovn-northd.c | 191 ++++++++++++++++++++++++++------------------
 1 file changed, 114 insertions(+), 77 deletions(-)
diff mbox series

Patch

diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
index 366fdd95f..96309a98a 100644
--- a/northd/ovn-northd.c
+++ b/northd/ovn-northd.c
@@ -8978,24 +8978,7 @@  build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
     struct ds actions = DS_EMPTY_INITIALIZER;
 
     struct ovn_datapath *od;
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_adm_ctrl_flows_for_lrouter(od, lflows);
-    }
-
     struct ovn_port *op;
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_adm_ctrl_flows_for_lrouter_port(op, lflows, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_neigh_learning_flows_for_lrouter(
-                od, lflows, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_neigh_learning_flows_for_lrouter_port(
-                op, lflows, &match, &actions);
-    }
 
     HMAP_FOR_EACH (od, key_node, datapaths) {
         if (!od->nbr) {
@@ -9956,63 +9939,6 @@  build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
         sset_destroy(&nat_entries);
     }
 
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_ND_RA_flows_for_lrouter_port(op, lflows, &match, &actions);
-    }
-
-    /* Logical router ingress table ND_RA_OPTIONS & ND_RA_RESPONSE: RS
-     * responder, by default goto next. (priority 0). */
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_ND_RA_flows_for_lrouter(od, lflows);
-    }
-
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_ip_routing_flows_for_lrouter_port(op, lflows);
-    }
-
-    /* Convert the static routes to flows. */
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_static_route_flows_for_lrouter(od, lflows, ports);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_mcast_lookup_flows_for_lrouter(od, lflows, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_ingress_policy_flows_for_lrouter(od, lflows, ports);
-    }
-
-    /* XXX destination unreachable */
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_arp_resolve_flows_for_lrouter(od, lflows);
-    }
-
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_arp_resolve_flows_for_lrouter_port(
-                op, lflows, ports, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_check_pkt_len_flows_for_lrouter(
-                od, lflows, ports, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_gateway_redirect_flows_for_lrouter(
-                od, lflows, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (od, key_node, datapaths) {
-        build_arp_request_flows_for_lrouter(od, lflows, &match, &actions);
-    }
-
-    HMAP_FOR_EACH (op, key_node, ports) {
-        build_egress_delivery_flows_for_lrouter_port(
-                op, lflows, &match, &actions);
-    }
-
     ds_destroy(&match);
     ds_destroy(&actions);
 }
@@ -11421,6 +11347,117 @@  build_ipv6_input_flows_for_lrouter_port(
 
 }
 
+struct lswitch_flow_build_info {
+    struct hmap *datapaths;
+    struct hmap *ports;
+    struct hmap *port_groups;
+    struct hmap *lflows;
+    struct hmap *mcgroups;
+    struct hmap *igmp_groups;
+    struct shash *meter_groups;
+    struct hmap *lbs;
+    char *svc_check_match;
+    struct ds match;
+    struct ds actions;
+};
+
+/* Helper function to combine all lflow generation which is iterated by
+ * datapath.
+ */
+
+static void
+build_lswitch_and_lrouter_iterate_by_od(
+            struct ovn_datapath *od, struct lswitch_flow_build_info *lsi)
+{
+
+    /* Build Logical Router Flows. */
+    build_adm_ctrl_flows_for_lrouter(od, lsi->lflows);
+    build_neigh_learning_flows_for_lrouter(od, lsi->lflows, &lsi->match,
+                                           &lsi->actions);
+    build_ND_RA_flows_for_lrouter(od, lsi->lflows);
+    build_static_route_flows_for_lrouter(od, lsi->lflows, lsi->ports);
+    build_mcast_lookup_flows_for_lrouter(od, lsi->lflows, &lsi->match,
+                                         &lsi->actions);
+    build_ingress_policy_flows_for_lrouter(od, lsi->lflows, lsi->ports);
+    build_arp_resolve_flows_for_lrouter(od, lsi->lflows);
+    build_check_pkt_len_flows_for_lrouter(od, lsi->lflows, lsi->ports,
+                                          &lsi->match, &lsi->actions);
+    build_gateway_redirect_flows_for_lrouter(od, lsi->lflows, &lsi->match,
+                                             &lsi->actions);
+    build_arp_request_flows_for_lrouter(od, lsi->lflows, &lsi->match,
+                                        &lsi->actions);
+}
+
+/* Helper function to combine all lflow generation which is iterated by port.
+ */
+
+static void
+build_lswitch_and_lrouter_iterate_by_op(
+                    struct ovn_port *op,
+                    struct lswitch_flow_build_info *lsi)
+{
+    /* Build Logical Router Flows. */
+
+    build_adm_ctrl_flows_for_lrouter_port(op, lsi->lflows, &lsi->match,
+                                          &lsi->actions);
+    build_neigh_learning_flows_for_lrouter_port(op, lsi->lflows, &lsi->match,
+                                                &lsi->actions);
+    build_ip_routing_flows_for_lrouter_port(op, lsi->lflows);
+    build_ND_RA_flows_for_lrouter_port(op, lsi->lflows, &lsi->match,
+                                       &lsi->actions);
+    build_arp_resolve_flows_for_lrouter_port(op, lsi->lflows, lsi->ports,
+                                             &lsi->match, &lsi->actions);
+    build_egress_delivery_flows_for_lrouter_port(op, lsi->lflows, &lsi->match,
+                                                 &lsi->actions);
+}
+
+static void
+build_lswitch_and_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
+                    struct hmap *port_groups, struct hmap *lflows,
+                    struct hmap *mcgroups, struct hmap *igmp_groups,
+                    struct shash *meter_groups,
+                    struct hmap *lbs)
+{
+
+    struct ovn_datapath *od;
+    struct ovn_port *op;
+
+    char *svc_check_match = xasprintf("eth.dst == %s", svc_monitor_mac);
+
+    struct lswitch_flow_build_info lsi = {
+        .datapaths = datapaths,
+        .ports = ports,
+        .port_groups = port_groups,
+        .lflows = lflows,
+        .mcgroups = mcgroups,
+        .igmp_groups = igmp_groups,
+        .meter_groups = meter_groups,
+        .lbs = lbs,
+        .svc_check_match = svc_check_match,
+        .match = DS_EMPTY_INITIALIZER,
+        .actions = DS_EMPTY_INITIALIZER,
+    };
+
+    /* Combined build - all lflow generation from lswitch and lrouter
+     * will move here and will be reogranized by iterator type.
+     */
+    HMAP_FOR_EACH (od, key_node, datapaths) {
+        build_lswitch_and_lrouter_iterate_by_od(od, &lsi);
+    }
+    HMAP_FOR_EACH (op, key_node, ports) {
+        build_lswitch_and_lrouter_iterate_by_op(op, &lsi);
+    }
+    free(svc_check_match);
+
+    /* Legacy lswitch build - to be migrated. */
+    build_lswitch_flows(datapaths, ports, port_groups, lflows, mcgroups,
+                        igmp_groups, meter_groups, lbs);
+
+    /* Legacy lrouter build - to be migrated. */
+    build_lrouter_flows(datapaths, ports, lflows, meter_groups, lbs);
+}
+
+
 /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB database,
  * constructing their contents based on the OVN_NB database. */
 static void
@@ -11432,9 +11469,9 @@  build_lflows(struct northd_context *ctx, struct hmap *datapaths,
 {
     struct hmap lflows = HMAP_INITIALIZER(&lflows);
 
-    build_lswitch_flows(datapaths, ports, port_groups, &lflows, mcgroups,
-                        igmp_groups, meter_groups, lbs);
-    build_lrouter_flows(datapaths, ports, &lflows, meter_groups, lbs);
+    build_lswitch_and_lrouter_flows(datapaths, ports,
+                                    port_groups, &lflows, mcgroups,
+                                    igmp_groups, meter_groups, lbs);
 
     /* Push changes to the Logical_Flow table to database. */
     const struct sbrec_logical_flow *sbflow, *next_sbflow;