This is a preliminary patch to allow OVN to configure QoS through OvS
db instead of running tc directly.

https://bugzilla.redhat.com/show_bug.cgi?id=2129742
Tested-by: Rodolfo Alonso <[email protected]>
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 controller/binding.c        | 56 ++++++++++++++++++++++---------------
 controller/binding.h        |  2 +-
 controller/ovn-controller.c | 10 +++----
 3 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/controller/binding.c b/controller/binding.c
index 09cf00af3..cde59ba99 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -191,7 +191,7 @@ static bool
 set_noop_qos(struct ovsdb_idl_txn *ovs_idl_txn,
              const struct ovsrec_port_table *port_table,
              const struct ovsrec_qos_table *qos_table,
-             struct sset *egress_ifaces)
+             struct smap *egress_ifaces)
 {
     if (!ovs_idl_txn) {
         return false;
@@ -206,11 +206,14 @@ set_noop_qos(struct ovsdb_idl_txn *ovs_idl_txn,
     size_t count = 0;
 
     OVSREC_PORT_TABLE_FOR_EACH (port, port_table) {
-        if (sset_contains(egress_ifaces, port->name)) {
-            ovsrec_port_set_qos(port, noop_qos);
-            count++;
+        struct smap_node *node;
+        SMAP_FOR_EACH (node, egress_ifaces) {
+            if (node->value && !strcmp(node->value, port->name)) {
+                ovsrec_port_set_qos(port, noop_qos);
+                count++;
+            }
         }
-        if (sset_count(egress_ifaces) == count) {
+        if (smap_count(egress_ifaces) == count) {
             break;
         }
     }
@@ -404,7 +407,7 @@ sbrec_get_port_encap(const struct sbrec_chassis 
*chassis_rec,
 static void
 add_localnet_egress_interface_mappings(
         const struct sbrec_port_binding *port_binding,
-        struct shash *bridge_mappings, struct sset *egress_ifaces)
+        struct shash *bridge_mappings, struct smap *egress_ifaces)
 {
     const char *network = smap_get(&port_binding->options, "network_name");
     if (!network) {
@@ -429,7 +432,8 @@ add_localnet_egress_interface_mappings(
             if (!is_egress_iface) {
                 continue;
             }
-            sset_add(egress_ifaces, iface_rec->name);
+            smap_replace(egress_ifaces, port_binding->logical_port,
+                         iface_rec->name);
         }
     }
 }
@@ -474,7 +478,7 @@ update_ld_multichassis_ports(const struct 
sbrec_port_binding *binding_rec,
 static void
 update_ld_localnet_port(const struct sbrec_port_binding *binding_rec,
                         struct shash *bridge_mappings,
-                        struct sset *egress_ifaces,
+                        struct smap *egress_ifaces,
                         struct hmap *local_datapaths)
 {
     /* Ignore localnet ports for unplugged networks. */
@@ -1909,7 +1913,7 @@ binding_run(struct binding_ctx_in *b_ctx_in, struct 
binding_ctx_out *b_ctx_out)
     }
 
     struct hmap *qos_map_ptr =
-        !sset_is_empty(b_ctx_out->egress_ifaces) ? &qos_map : NULL;
+        smap_is_empty(b_ctx_out->egress_ifaces) ? NULL : &qos_map;
 
     struct ovs_list localnet_lports = OVS_LIST_INITIALIZER(&localnet_lports);
     struct ovs_list external_lports = OVS_LIST_INITIALIZER(&external_lports);
@@ -2042,12 +2046,12 @@ binding_run(struct binding_ctx_in *b_ctx_in, struct 
binding_ctx_out *b_ctx_out)
 
     shash_destroy(&bridge_mappings);
 
-    if (!sset_is_empty(b_ctx_out->egress_ifaces)
+    if (!smap_is_empty(b_ctx_out->egress_ifaces)
         && set_noop_qos(b_ctx_in->ovs_idl_txn, b_ctx_in->port_table,
                         b_ctx_in->qos_table, b_ctx_out->egress_ifaces)) {
-        const char *entry;
-        SSET_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
-            setup_qos(entry, &qos_map);
+        const struct smap_node *entry;
+        SMAP_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
+            setup_qos(entry->value, &qos_map);
         }
     }
 
@@ -2437,12 +2441,18 @@ binding_handle_ovs_interface_changes(struct 
binding_ctx_in *b_ctx_in,
             break;
         }
 
-        if (smap_get(&iface_rec->external_ids, "ovn-egress-iface") ||
-            sset_contains(b_ctx_out->egress_ifaces, iface_rec->name)) {
+        if (smap_get(&iface_rec->external_ids, "ovn-egress-iface")) {
             handled = false;
             break;
         }
 
+        struct smap_node *node;
+        SMAP_FOR_EACH (node, b_ctx_out->egress_ifaces) {
+            if (node->value && !strcmp(node->value, iface_rec->name)) {
+                return false;
+            }
+        }
+
         const char *iface_id = smap_get(&iface_rec->external_ids, "iface-id");
         const char *old_iface_id = smap_get(b_ctx_out->local_iface_ids,
                                             iface_rec->name);
@@ -2486,7 +2496,7 @@ binding_handle_ovs_interface_changes(struct 
binding_ctx_in *b_ctx_in,
 
     struct hmap qos_map = HMAP_INITIALIZER(&qos_map);
     struct hmap *qos_map_ptr =
-        sset_is_empty(b_ctx_out->egress_ifaces) ? NULL : &qos_map;
+        smap_is_empty(b_ctx_out->egress_ifaces) ? NULL : &qos_map;
 
     /*
      * We consider an OVS interface for claiming if the following
@@ -2527,9 +2537,9 @@ binding_handle_ovs_interface_changes(struct 
binding_ctx_in *b_ctx_in,
                                                b_ctx_in->port_table,
                                                b_ctx_in->qos_table,
                                                b_ctx_out->egress_ifaces)) {
-        const char *entry;
-        SSET_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
-            setup_qos(entry, &qos_map);
+        const struct smap_node *entry;
+        SMAP_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
+            setup_qos(entry->value, &qos_map);
         }
     }
 
@@ -2970,7 +2980,7 @@ delete_done:
 
     struct hmap qos_map = HMAP_INITIALIZER(&qos_map);
     struct hmap *qos_map_ptr =
-        sset_is_empty(b_ctx_out->egress_ifaces) ? NULL : &qos_map;
+        smap_is_empty(b_ctx_out->egress_ifaces) ? NULL : &qos_map;
 
     SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb,
                                                b_ctx_in->port_binding_table) {
@@ -3050,9 +3060,9 @@ delete_done:
                                                b_ctx_in->port_table,
                                                b_ctx_in->qos_table,
                                                b_ctx_out->egress_ifaces)) {
-        const char *entry;
-        SSET_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
-            setup_qos(entry, &qos_map);
+        const struct smap_node *entry;
+        SMAP_FOR_EACH (entry, b_ctx_out->egress_ifaces) {
+            setup_qos(entry->value, &qos_map);
         }
     }
 
diff --git a/controller/binding.h b/controller/binding.h
index 6c3a98b02..6fc199aea 100644
--- a/controller/binding.h
+++ b/controller/binding.h
@@ -91,7 +91,7 @@ struct binding_ctx_out {
      */
     bool non_vif_ports_changed;
 
-    struct sset *egress_ifaces;
+    struct smap *egress_ifaces;
     /* smap of OVS interface name as key and
      * OVS interface external_ids:iface-id as value. */
     struct smap *local_iface_ids;
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index e170e9262..d172a1f4f 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -1355,7 +1355,7 @@ struct ed_type_runtime_data {
     struct sset active_tunnels;
 
     /* runtime data engine private data. */
-    struct sset egress_ifaces;
+    struct smap egress_ifaces;
     struct smap local_iface_ids;
 
     /* Tracked data. See below for more details and comments. */
@@ -1451,7 +1451,7 @@ en_runtime_data_init(struct engine_node *node OVS_UNUSED,
     sset_init(&data->local_lports);
     related_lports_init(&data->related_lports);
     sset_init(&data->active_tunnels);
-    sset_init(&data->egress_ifaces);
+    smap_init(&data->egress_ifaces);
     smap_init(&data->local_iface_ids);
     local_binding_data_init(&data->lbinding_data);
     shash_init(&data->local_active_ports_ipv6_pd);
@@ -1471,7 +1471,7 @@ en_runtime_data_cleanup(void *data)
     sset_destroy(&rt_data->local_lports);
     related_lports_destroy(&rt_data->related_lports);
     sset_destroy(&rt_data->active_tunnels);
-    sset_destroy(&rt_data->egress_ifaces);
+    smap_destroy(&rt_data->egress_ifaces);
     smap_destroy(&rt_data->local_iface_ids);
     local_datapaths_destroy(&rt_data->local_datapaths);
     shash_destroy(&rt_data->local_active_ports_ipv6_pd);
@@ -1589,13 +1589,13 @@ en_runtime_data_run(struct engine_node *node, void 
*data)
         sset_destroy(local_lports);
         related_lports_destroy(&rt_data->related_lports);
         sset_destroy(active_tunnels);
-        sset_destroy(&rt_data->egress_ifaces);
+        smap_destroy(&rt_data->egress_ifaces);
         smap_destroy(&rt_data->local_iface_ids);
         hmap_init(local_datapaths);
         sset_init(local_lports);
         related_lports_init(&rt_data->related_lports);
         sset_init(active_tunnels);
-        sset_init(&rt_data->egress_ifaces);
+        smap_init(&rt_data->egress_ifaces);
         smap_init(&rt_data->local_iface_ids);
         local_binding_data_init(&rt_data->lbinding_data);
     }
-- 
2.39.2

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

Reply via email to