Introduce qos_physical_network in port_binding config column in order to
indicate the name of the egress network name where traffic shaping will
be applied.
This is a preliminary patch to rework OVN QoS implementation in order to
configure it through OVS QoS table instead of running tc command
directly bypassing OVS.

Acked-by: Numan Siddique <[email protected]>
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 controller/binding.c |  6 ++++++
 northd/northd.c      | 10 ++++++++++
 ovn-sb.xml           |  5 +++++
 tests/ovn-northd.at  | 22 ++++++++++++++++++++++
 4 files changed, 43 insertions(+)

diff --git a/controller/binding.c b/controller/binding.c
index ad19a4092..5040b426f 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -142,6 +142,7 @@ static void update_lport_tracking(const struct 
sbrec_port_binding *pb,
 struct qos_queue {
     struct hmap_node node;
 
+    char *network;
     char *port;
 
     uint32_t queue_id;
@@ -165,6 +166,7 @@ find_qos_queue(struct hmap *queue_map, uint32_t hash, const 
char *port)
 static void
 qos_queue_erase_entry(struct qos_queue *q)
 {
+    free(q->network);
     free(q->port);
     free(q);
 }
@@ -186,6 +188,7 @@ get_qos_queue(const struct sbrec_port_binding *pb, struct 
hmap *queue_map)
     uint32_t max_rate = smap_get_int(&pb->options, "qos_max_rate", 0);
     uint32_t burst = smap_get_int(&pb->options, "qos_burst", 0);
     uint32_t queue_id = smap_get_int(&pb->options, "qdisc_queue_id", 0);
+    const char *network = smap_get(&pb->options, "qos_physical_network");
 
     if ((!min_rate && !max_rate && !burst) || !queue_id) {
         /* Qos is not configured for this port. */
@@ -200,6 +203,9 @@ get_qos_queue(const struct sbrec_port_binding *pb, struct 
hmap *queue_map)
         q->port = xstrdup(pb->logical_port);
         q->queue_id = queue_id;
     }
+
+    free(q->network);
+    q->network = network ? xstrdup(network) : NULL;
     q->min_rate = min_rate;
     q->max_rate = max_rate;
     q->burst = burst;
diff --git a/northd/northd.c b/northd/northd.c
index 7190cd18f..470f76809 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3505,7 +3505,17 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn,
             }
 
             smap_clone(&options, &op->nbsp->options);
+
             if (queue_id) {
+                if (op->od->n_localnet_ports) {
+                    struct ovn_port *port = op->od->localnet_ports[0];
+                    const char *physical_network = smap_get(
+                            &port->nbsp->options, "network_name");
+                    if (physical_network) {
+                        smap_add(&options, "qos_physical_network",
+                                 physical_network);
+                    }
+                }
                 smap_add_format(&options,
                                 "qdisc_queue_id", "%d", queue_id);
             }
diff --git a/ovn-sb.xml b/ovn-sb.xml
index ead9efcab..0988cb1f8 100644
--- a/ovn-sb.xml
+++ b/ovn-sb.xml
@@ -3691,6 +3691,11 @@ tcp.flags = RST;
         interface, in bits.
       </column>
 
+      <column name="options" key="qos_physical_network">
+        If set, indicates the name of the egress network name where traffic
+        shaping will be applied.
+      </column>
+
       <column name="options" key="qdisc_queue_id"
               type='{"type": "integer", "minInteger": 1, "maxInteger": 61440}'>
         Indicates the queue number on the physical device. This is same as the
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 1f6169b77..a9af0f76a 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -9064,3 +9064,25 @@ mac_binding_timestamp: true
 
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD_NO_HV([
+AT_SETUP([check OVN QoS])
+AT_KEYWORDS([OVN-QoS])
+ovn_start
+
+check ovn-nbctl ls-add ls
+check ovn-nbctl lsp-add ls public
+check ovn-nbctl lsp-set-type public localnet
+check ovn-nbctl lsp-set-addresses public unknown
+
+check_column "" sb:Port_Binding options logical_port=public
+
+check ovn-nbctl --wait=sb set Logical_Switch_Port public 
options:qos_min_rate=200000
+AT_CHECK([fetch_column sb:Port_Binding options logical_port=public |grep -q 
'qos_min_rate=200000'])
+AT_CHECK([fetch_column sb:Port_Binding options logical_port=public |grep -q 
'qos_physical_network'],[1])
+
+check ovn-nbctl --wait=sb set Logical_Switch_Port public 
options:qos_min_rate=200000 options:network_name=phys
+AT_CHECK([fetch_column sb:Port_Binding options logical_port=public |grep -q 
'qos_physical_network=phys'])
+
+AT_CLEANUP
+])
-- 
2.40.1

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

Reply via email to