This patch allows to apply QoS rules on the localnet port related to
logical switch ports running on the same datapath. Considering the
following netowrk configuration:

LSP{0,1} -- LogicalSwitch -- Localnet0

It is possible to apply the following QoS rules on Localnet0 on egress traffic
entering the cluster from LSP{0,1}:
- LSP0: min-rate r0, max_rate R0
- LSP1: min-rate r1, max_rate R1

Acked-By: Ihar Hrachyshka <ihrac...@redhat.com>
Tested-by: Rodolfo Alonso <ralon...@redhat.com>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
---
 controller/binding.c    |   6 +-
 northd/northd.c         |  26 ++++--
 northd/ovn-northd.8.xml |  12 +++
 tests/ovn-northd.at     |   2 +
 tests/ovn.at            | 185 ++++++++++++++++++++++++++++++++++++++++
 tests/system-ovn.at     |  86 ++++++++++++++++++-
 6 files changed, 306 insertions(+), 11 deletions(-)

diff --git a/controller/binding.c b/controller/binding.c
index bf0ec9834..2fa044b52 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -202,9 +202,9 @@ get_qos_egress_port_interface(struct shash *bridge_mappings,
                 continue;
             }
 
-            bool is_egress_iface = smap_get_bool(&iface->external_ids,
-                                                 "ovn-egress-iface", false);
-            if (is_egress_iface) {
+            if (smap_get_bool(&iface->external_ids,
+                              "ovn-egress-iface", false) ||
+                !strcmp(iface->type, "")) {
                 *pport = port;
                 return iface;
             }
diff --git a/northd/northd.c b/northd/northd.c
index c107fe33a..2f96d15a4 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -5737,15 +5737,29 @@ build_lswitch_port_sec_op(struct ovn_port *op, struct 
hmap *lflows,
                                           ds_cstr(match), ds_cstr(actions),
                                           op->key, &op->nbsp->header_);
 
+        if (!lsp_is_localnet(op->nbsp) && !op->od->n_localnet_ports) {
+            return;
+        }
+
+        ds_clear(actions);
+        ds_put_format(actions, "set_queue(%s); output;", queue_id);
+
+        ds_clear(match);
         if (lsp_is_localnet(op->nbsp)) {
-            ds_clear(match);
-            ds_clear(actions);
             ds_put_format(match, "outport == %s", op->json_key);
-            ds_put_format(actions, "set_queue(%s); output;", queue_id);
             ovn_lflow_add_with_lport_and_hint(lflows, op->od,
-                                            S_SWITCH_OUT_APPLY_PORT_SEC, 100,
-                                            ds_cstr(match), ds_cstr(actions),
-                                            op->key, &op->nbsp->header_);
+                                              S_SWITCH_OUT_APPLY_PORT_SEC, 100,
+                                              ds_cstr(match), ds_cstr(actions),
+                                              op->key, &op->nbsp->header_);
+        } else if (op->od->n_localnet_ports) {
+            ds_put_format(match, "outport == %s && inport == %s",
+                          op->od->localnet_ports[0]->json_key,
+                          op->json_key);
+            ovn_lflow_add_with_lport_and_hint(lflows, op->od,
+                    S_SWITCH_OUT_APPLY_PORT_SEC, 110,
+                    ds_cstr(match), ds_cstr(actions),
+                    op->od->localnet_ports[0]->key,
+                    &op->od->localnet_ports[0]->nbsp->header_);
         }
     }
 }
diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
index 70153dc9e..7da912da3 100644
--- a/northd/ovn-northd.8.xml
+++ b/northd/ovn-northd.8.xml
@@ -2223,6 +2223,18 @@ output;
     </p>
 
     <ul>
+      <li>
+        <p>
+        For each port configured with egress qos in the
+        <ref column="options:qdisc_queue_id" table="Logical_Switch_Port"
+        db="OVN_Northbound"/> column of <ref table="Logical_Switch_Port"
+        db="OVN_Northbound"/>, running a localnet port on the same logical
+        switch, a priority 110 flow is added which matches on the localnet
+        <code>outport</code> and on the port <code>inport</code> and
+        applies the action <code>set_queue(id); output;"</code>.
+        </p>
+      </li>
+
       <li>
         <p>
         For each localnet port configured with egress qos in the
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index a9af0f76a..c52f86490 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -8154,6 +8154,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
   table=??(ls_out_check_port_sec), priority=0    , match=(1), 
action=(reg0[[15]] = check_out_port_sec(); next;)
   table=??(ls_out_check_port_sec), priority=100  , match=(eth.mcast), 
action=(reg0[[15]] = 0; next;)
   table=??(ls_out_apply_port_sec), priority=0    , match=(1), action=(output;)
+  table=??(ls_out_apply_port_sec), priority=110  , match=(outport == 
"localnetport" && inport == "sw0p2"), action=(set_queue(10); output;)
   table=??(ls_out_apply_port_sec), priority=50   , match=(reg0[[15]] == 1), 
action=(drop;)
 ])
 
@@ -8184,6 +8185,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
   table=??(ls_out_check_port_sec), priority=100  , match=(eth.mcast), 
action=(reg0[[15]] = 0; next;)
   table=??(ls_out_apply_port_sec), priority=0    , match=(1), action=(output;)
   table=??(ls_out_apply_port_sec), priority=100  , match=(outport == 
"localnetport"), action=(set_queue(10); output;)
+  table=??(ls_out_apply_port_sec), priority=110  , match=(outport == 
"localnetport" && inport == "sw0p2"), action=(set_queue(10); output;)
   table=??(ls_out_apply_port_sec), priority=50   , match=(reg0[[15]] == 1), 
action=(drop;)
 ])
 
diff --git a/tests/ovn.at b/tests/ovn.at
index 2ba7c7ce5..18cea7458 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -35659,3 +35659,188 @@ check test "$current_id2" = "$prev_id2"
 OVN_CLEANUP([hv1])
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([OVN QoS])
+ovn_start
+
+check ovn-nbctl ls-add ls0
+check ovn-nbctl lsp-add ls0 public0
+check ovn-nbctl lsp-set-addresses public0 unknown
+check ovn-nbctl lsp-set-type public0 localnet
+check ovn-nbctl lsp-set-options public0 network_name=phys
+net_add n
+
+# two hypervisors, each connected to the same network
+for i in 1 2; do
+    sim_add hv-$i
+    as hv-$i
+    ovs-vsctl add-br br-phys
+    ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys
+    ovn_attach n br-phys 192.168.0.$i
+done
+
+for i in 1 2; do
+    check ovn-nbctl lsp-add ls0 lsp$i
+    check ovn-nbctl lsp-set-addresses lsp$i f0:00:00:00:00:0$i
+done
+
+for i in 1 2; do
+    as hv-$i
+    ovs-vsctl add-port br-int vif$i -- set Interface vif$i 
external-ids:iface-id=lsp$i \
+                                  ofport-request=$i
+    OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up lsp$i` = xup])
+
+    # Patch port might be created after ports are reported up
+    # Wait for a flow outputing to patch port
+    OVN_WAIT_PATCH_PORT_FLOWS(["public0"], ["hv-$i"])
+done
+
+check ovn-nbctl set Logical_Switch_Port lsp1 options:qos_min_rate=200000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="200000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 'max-rate="0"') 
-eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 'burst="0"') -eq 
1])
+
+check ovn-nbctl set Logical_Switch_Port lsp1 options:qos_max_rate=350000
+check ovn-nbctl set Logical_Switch_Port lsp1 options:qos_burst=3000000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="350000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 1])
+
+check ovn-nbctl set Logical_Switch_Port lsp2 options:qos_min_rate=400000
+check ovn-nbctl set Logical_Switch_Port lsp2 options:qos_max_rate=500000
+check ovn-nbctl set Logical_Switch_Port lsp2 options:qos_burst=3000000
+
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'min-rate="400000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'max-rate="500000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 1])
+
+check ovn-nbctl lsp-add ls0 lsp3
+check ovn-nbctl lsp-set-addresses lsp3 f0:00:00:00:00:03
+as hv-1
+ovs-vsctl add-port br-int vif3 -- \
+    set Interface vif3 external-ids:iface-id=lsp3 \
+    ofport-request=3
+OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up lsp3` = xup])
+
+check ovn-nbctl lsp-add ls0 lsp4
+check ovn-nbctl lsp-set-addresses lsp4 f0:00:00:00:00:04
+as hv-1
+ovs-vsctl add-port br-int vif4 -- \
+    set Interface vif4 external-ids:iface-id=lsp4 \
+    ofport-request=4
+OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up lsp4` = xup])
+
+check ovn-nbctl set Logical_Switch_Port lsp3 options:qos_min_rate=700000
+check ovn-nbctl set Logical_Switch_Port lsp3 options:qos_max_rate=800000
+check ovn-nbctl set Logical_Switch_Port lsp3 options:qos_burst=9000000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="200000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="350000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="700000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="800000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="9000000"') -eq 1])
+
+check ovn-nbctl remove Logical_Switch_Port lsp3 options qos_min_rate=700000
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 'min-rate="0"') 
-eq 1])
+
+check ovn-nbctl remove Logical_Switch_Port lsp3 options qos_max_rate=800000
+check ovn-nbctl remove Logical_Switch_Port lsp3 options qos_burst=9000000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="200000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="350000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="700000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="800000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="9000000"') -eq 0])
+
+check ovn-nbctl set Logical_Switch_Port lsp4 options:qos_min_rate=1700000
+check ovn-nbctl set Logical_Switch_Port lsp4 options:qos_max_rate=1800000
+check ovn-nbctl set Logical_Switch_Port lsp4 options:qos_burst=19000000
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="1700000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="1800000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="19000000"') -eq 1])
+
+as hv-1
+ovs-vsctl remove Interface vif4 external-ids iface-id
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="1700000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="1800000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="19000000"') -eq 0])
+
+check ovn-nbctl set Logical_Switch_Port lsp2 options:qos_min_rate=410000
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'min-rate="410000"') -eq 1])
+
+check ovn-nbctl remove Logical_Switch_Port lsp2 options qos_min_rate=410000
+check ovn-nbctl remove Logical_Switch_Port lsp2 options qos_max_rate=500000
+check ovn-nbctl remove Logical_Switch_Port lsp2 options qos_burst=3000000
+
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list qos | grep -c linux-htb) -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'min-rate="410000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'max-rate="500000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-2 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 0])
+
+check ovn-nbctl lsp-del lsp1
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="200000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="350000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 0])
+
+check ovn-nbctl set Logical_Switch_Port public0 options:qos_min_rate=100000
+check ovn-nbctl set Logical_Switch_Port public0 options:qos_max_rate=200000
+check ovn-nbctl set Logical_Switch_Port public0 options:qos_burst=3000000
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="100000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="200000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 1])
+
+check ovn-nbctl ls-add ls1
+check ovn-nbctl lsp-add ls1 public1
+check ovn-nbctl lsp-set-addresses public1 unknown
+check ovn-nbctl lsp-set-type public1 localnet
+
+check ovn-nbctl lsp-add ls1 lsp5
+check ovn-nbctl lsp-set-addresses lsp5 f0:00:00:00:00:05
+as hv-1
+ovs-vsctl add-port br-int vif5 -- \
+    set Interface vif5 external-ids:iface-id=lsp5 \
+    ofport-request=5
+OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up lsp5` = xup])
+
+check ovn-nbctl set Logical_Switch_Port public1 options:qos_min_rate=6000000000
+check ovn-nbctl set Logical_Switch_Port public1 options:qos_max_rate=7000000000
+check ovn-nbctl set Logical_Switch_Port public1 options:qos_burst=8000000000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="6000000000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="7000000000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="8000000000"') -eq 0])
+
+check ovn-nbctl set Logical_Switch_Port public1 
options:qos_min_rate=6000000000 options:qos_max_rate=7000000000 
options:qos_burst=8000000000 options:network_name=phys
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="6000000000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="7000000000"') -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="8000000000"') -eq 1])
+
+check ovn-nbctl lsp-del public0
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 1])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="100000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="200000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="3000000"') -eq 0])
+
+check ovn-nbctl remove Logical_Switch_Port public1 options 
qos_min_rate=6000000000
+check ovn-nbctl remove Logical_Switch_Port public1 options 
qos_max_rate=7000000000
+check ovn-nbctl remove Logical_Switch_Port public1 options qos_burst=8000000000
+
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | grep -c linux-htb) -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'min-rate="6000000000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'max-rate="7000000000"') -eq 0])
+OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list queue | grep -c 
'burst="8000000000"') -eq 0])
+
+AT_CLEANUP
+])
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index a4387349c..8fe8e4d28 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -6553,6 +6553,11 @@ ADD_VETH(sw01, sw01, br-int, "192.168.1.2/24", 
"f0:00:00:01:02:03")
 ovn-nbctl lsp-add sw0 sw01 \
     -- lsp-set-addresses sw01 "f0:00:00:01:02:03 192.168.1.2"
 
+ADD_NAMESPACES(sw02)
+ADD_VETH(sw02, sw02, br-int, "192.168.1.3/24", "f0:00:00:01:02:44")
+ovn-nbctl lsp-add sw0 sw02 \
+    -- lsp-set-addresses sw02 "f0:00:00:01:02:44 192.168.1.3"
+
 ovn-nbctl ls-add sw1
 
 ADD_NAMESPACES(sw11)
@@ -6560,6 +6565,11 @@ ADD_VETH(sw11, sw11, br-int, "192.168.4.2/24", 
"f0:00:00:01:04:03")
 ovn-nbctl lsp-add sw1 sw11 \
     -- lsp-set-addresses sw11 "f0:00:00:01:04:03 192.168.4.2"
 
+ADD_NAMESPACES(sw12)
+ADD_VETH(sw12, sw12, br-int, "192.168.4.3/24", "f0:00:00:03:04:03")
+ovn-nbctl lsp-add sw1 sw12 \
+    -- lsp-set-addresses sw11 "f0:00:00:03:04:03 192.168.4.3"
+
 ADD_NAMESPACES(public)
 ADD_VETH(public, public, br-public, "192.168.2.2/24", "f0:00:00:01:02:05")
 AT_CHECK([ovs-vsctl remove interface ovs-public external-ids iface-id=public])
@@ -6582,12 +6592,10 @@ ovn-nbctl lsp-add sw1 ext \
 AT_CHECK([ovn-nbctl set Logical_Switch_Port public 
options:qos_min_rate=200000])
 AT_CHECK([ovn-nbctl set Logical_Switch_Port public 
options:qos_max_rate=300000])
 AT_CHECK([ovn-nbctl set Logical_Switch_Port public options:qos_burst=3000000])
-AT_CHECK([ovs-vsctl set interface ovs-public 
external-ids:ovn-egress-iface=true])
 
 AT_CHECK([ovn-nbctl set Logical_Switch_Port ext options:qos_min_rate=400000])
 AT_CHECK([ovn-nbctl set Logical_Switch_Port ext options:qos_max_rate=600000])
 AT_CHECK([ovn-nbctl set Logical_Switch_Port ext options:qos_burst=6000000])
-AT_CHECK([ovs-vsctl set interface ovs-ext external-ids:ovn-egress-iface=true])
 
 OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-public'])
 OVS_WAIT_UNTIL([tc class show dev ovs-public | \
@@ -6634,6 +6642,80 @@ AT_CHECK([ovn-nbctl remove Logical_Switch_Port public 
options qos_burst=6000000]
 
 OVS_WAIT_UNTIL([test "$(tc qdisc show | grep 'htb 1: dev ovs-public')" = ""])
 
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw01 options:qos_min_rate=200000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw01 options:qos_max_rate=350000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw01 options:qos_burst=3000000])
+
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw11 options:qos_min_rate=400000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw11 options:qos_max_rate=700000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw11 options:qos_burst=6000000])
+
+OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-public'])
+OVS_WAIT_UNTIL([tc class show dev ovs-public | \
+                grep -q 'class htb .* rate 200Kbit ceil 350Kbit burst 375000b 
cburst 374999b'])
+
+OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-ext'])
+OVS_WAIT_UNTIL([tc class show dev ovs-ext | \
+                grep -q 'class htb .* prio 0 rate 400Kbit ceil 700Kbit burst 
750000b cburst 749999b'])
+
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 options:qos_min_rate=300000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 options:qos_max_rate=500000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 options:qos_burst=3000000])
+
+OVS_WAIT_UNTIL([tc class show dev ovs-public | \
+                grep -q 'class htb .* prio 0 rate 300Kbit ceil 500Kbit burst 
375000b cburst 375000b'])
+
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw12 options:qos_min_rate=400000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw12 options:qos_max_rate=500000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw12 options:qos_burst=3000000])
+
+OVS_WAIT_UNTIL([tc class show dev ovs-ext | \
+                grep -q 'class htb .* prio 0 rate 400Kbit ceil 500Kbit burst 
375000b cburst 375000b'])
+
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw02 options 
qos_min_rate=300000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw02 options 
qos_max_rate=500000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw02 options qos_burst=3000000])
+
+OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-public'])
+OVS_WAIT_UNTIL([tc class show dev ovs-public | \
+                grep -q 'class htb .* rate 200Kbit ceil 350Kbit burst 375000b 
cburst 374999b'])
+OVS_WAIT_UNTIL([test "$(tc class show dev ovs-public | \
+                grep 'class htb .* prio 0 rate 300Kbit ceil 500Kbit burst 
375000b cburst 375000b')" = ""])
+
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw01 options 
qos_min_rate=200000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw01 options 
qos_max_rate=350000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw01 options qos_burst=3000000])
+OVS_WAIT_UNTIL([test "$(tc qdisc show | grep 'htb 1: dev ovs-public')" = ""])
+
+OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-ext'])
+OVS_WAIT_UNTIL([tc class show dev ovs-ext | \
+                grep -q 'class htb .* prio 0 rate 400Kbit ceil 700Kbit burst 
750000b cburst 749999b'])
+OVS_WAIT_UNTIL([tc class show dev ovs-ext | \
+                grep -q 'class htb .* prio 0 rate 400Kbit ceil 500Kbit burst 
375000b cburst 375000b'])
+
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw11 options 
qos_min_rate=400000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw11 options 
qos_max_rate=700000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw11 options qos_burst=6000000])
+
+OVS_WAIT_UNTIL([tc qdisc show | grep -q 'htb 1: dev ovs-ext'])
+OVS_WAIT_UNTIL([test "$(tc class show dev ovs-ext | \
+                grep 'class htb .* prio 0 rate 400Kbit ceil 700Kbit burst 
750000b cburst 749999b')" = ""])
+OVS_WAIT_UNTIL([tc class show dev ovs-ext | \
+                grep -q 'class htb .* prio 0 rate 400Kbit ceil 500Kbit burst 
375000b cburst 375000b'])
+
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw12 options 
qos_min_rate=400000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw12 options 
qos_max_rate=500000])
+AT_CHECK([ovn-nbctl remove Logical_Switch_Port sw12 options qos_burst=3000000])
+
+OVS_WAIT_UNTIL([test "$(tc qdisc show | grep 'htb 1: dev ovs-ext')" = ""])
+
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 
options:qos_min_rate=5000000000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 
options:qos_max_rate=6000000000])
+AT_CHECK([ovn-nbctl set Logical_Switch_Port sw02 options:qos_burst=1000000])
+
+OVS_WAIT_UNTIL([tc class show dev ovs-public | \
+                grep -q 'class htb .* prio 0 rate 5Gbit ceil 6Gbit burst 
125000b cburst 124500b'])
+
 kill $(pidof ovn-controller)
 
 as ovn-sb
-- 
2.40.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to