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
