On Wed, May 17, 2023 at 5:02 AM Lorenzo Bianconi
<[email protected]> wrote:
>
> 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.
>
> Signed-off-by: Lorenzo Bianconi <[email protected]>
> ---
>  controller/binding.c |  8 ++++++++
>  northd/northd.c      | 10 ++++++++++
>  ovn-sb.xml           |  5 +++++
>  tests/ovn-northd.at  | 22 ++++++++++++++++++++++
>  4 files changed, 45 insertions(+)
>
> diff --git a/controller/binding.c b/controller/binding.c
> index ad19a4092..91437dbb8 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,11 @@ 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);

There is a potential double free error for the q->network.

I tested it locally and could reproduce the crash. After freeing
please set q->network to NULL.

Numan

> +    if (network) {
> +        q->network = xstrdup(network);
> +    }
>      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
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to