diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch index 86a95e7..807add2 100644 --- a/SOURCES/openvswitch-2.17.0.patch +++ b/SOURCES/openvswitch-2.17.0.patch @@ -56163,7 +56163,7 @@ index 2ad03e044e..0b9dc4278c 100644 ds_put_format(s, "%snw_frag=%s%s,", colors.param, colors.end, f->nw_frag & FLOW_NW_FRAG_ANY diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c -index 6730301b67..029ca28558 100644 +index 6730301b67..43805ae4d5 100644 --- a/lib/mcast-snooping.c +++ b/lib/mcast-snooping.c @@ -356,11 +356,11 @@ mcast_snooping_prune_expired(struct mcast_snooping *ms, @@ -56180,14 +56180,15 @@ index 6730301b67..029ca28558 100644 /* This list is sorted on expiration time. */ if (b->expires > timenow) { break; -@@ -946,15 +946,15 @@ mcast_snooping_wait(struct mcast_snooping *ms) +@@ -946,15 +946,16 @@ mcast_snooping_wait(struct mcast_snooping *ms) void mcast_snooping_flush_bundle(struct mcast_snooping *ms, void *port) { - struct mcast_group *g, *next_g; - struct mcast_mrouter_bundle *m, *next_m; -+ struct mcast_group *g; + struct mcast_mrouter_bundle *m; ++ struct mcast_port_bundle *p; ++ struct mcast_group *g; if (!mcast_snooping_enabled(ms)) { return; @@ -56199,7 +56200,7 @@ index 6730301b67..029ca28558 100644 if (mcast_group_delete_bundle(ms, g, port)) { ms->need_revalidate = true; -@@ -964,7 +964,7 @@ mcast_snooping_flush_bundle(struct mcast_snooping *ms, void *port) +@@ -964,12 +965,26 @@ mcast_snooping_flush_bundle(struct mcast_snooping *ms, void *port) } } @@ -56208,6 +56209,25 @@ index 6730301b67..029ca28558 100644 if (m->port == port) { mcast_snooping_flush_mrouter(m); ms->need_revalidate = true; + } + } + ++ LIST_FOR_EACH_SAFE (p, node, &ms->fport_list) { ++ if (p->port == port) { ++ mcast_snooping_flush_port(p); ++ ms->need_revalidate = true; ++ } ++ } ++ ++ LIST_FOR_EACH_SAFE (p, node, &ms->rport_list) { ++ if (p->port == port) { ++ mcast_snooping_flush_port(p); ++ ms->need_revalidate = true; ++ } ++ } ++ + ovs_rwlock_unlock(&ms->rwlock); + } diff --git a/lib/meta-flow.c b/lib/meta-flow.c index e03cd8d0c5..474344194f 100644 --- a/lib/meta-flow.c @@ -69254,10 +69274,339 @@ index db4997d8f0..6489be2c15 100644 AT_SETUP([stopwatch module]) diff --git a/tests/mcast-snooping.at b/tests/mcast-snooping.at -index 757cf7186e..fe475e7b38 100644 +index 757cf7186e..77b3acddb8 100644 --- a/tests/mcast-snooping.at +++ b/tests/mcast-snooping.at -@@ -216,3 +216,70 @@ AT_CHECK([ovs-appctl mdb/show br0], [0], [dnl +@@ -105,6 +105,328 @@ AT_CHECK([ovs-appctl mdb/show br0], [0], [dnl + OVS_VSWITCHD_STOP + AT_CLEANUP + ++ ++AT_SETUP([mcast - check multicast per port flooding]) ++OVS_VSWITCHD_START([]) ++ ++AT_CHECK([ ++ ovs-vsctl set bridge br0 \ ++ datapath_type=dummy \ ++ mcast_snooping_enable=true \ ++ other-config:mcast-snooping-disable-flood-unregistered=false ++], [0]) ++ ++AT_CHECK([ovs-ofctl add-flow br0 action=normal]) ++ ++AT_CHECK([ ++ ovs-vsctl add-port br0 p1 \ ++ -- set Interface p1 type=dummy other-config:hwaddr=aa:55:aa:55:00:01 ofport_request=1 \ ++ -- add-port br0 p2 \ ++ -- set Interface p2 type=dummy other-config:hwaddr=aa:55:aa:55:00:02 ofport_request=2 \ ++ -- add-port br0 p3 \ ++ -- set Interface p3 type=dummy other-config:hwaddr=aa:55:aa:55:00:03 ofport_request=3 \ ++], [0]) ++ ++ovs-appctl time/stop ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [stdout]) ++AT_CHECK([grep -v 'Datapath actions:' stdout], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> unregistered multicast, flooding ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++]) ++AT_CHECK([sed -ne 's/^Datapath actions: \(.*\)$/\1/p' stdout | tr "," "\n" | sort -n], [0], [dnl ++1 ++2 ++100 ++]) ++ ++# Send report packets. ++AT_CHECK([ ++ ovs-appctl netdev-dummy/receive p1 \ ++ '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101' ++], [0]) ++AT_CHECK([ovs-appctl mdb/show br0], [0], [dnl ++ port VLAN GROUP Age ++ 1 0 224.1.1.1 0 ++]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast group port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 1 ++]) ++ ++AT_CHECK([ovs-vsctl set port p2 other_config:mcast-snooping-flood=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast group port ++ -> forwarding to mcast flood port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 1,2 ++]) ++ ++AT_CHECK([ovs-vsctl set port p3 other_config:mcast-snooping-flood=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast group port ++ -> forwarding to mcast flood port ++ -> mcast flood port is input port, dropping ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 1,2 ++]) ++ ++# Change p2 ofport to force a ofbundle change and check that the mdb contains ++# no stale port. ++AT_CHECK([ovs-vsctl set interface p2 ofport_request=4]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast group port ++ -> mcast flood port is input port, dropping ++ -> forwarding to mcast flood port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 1,2 ++]) ++ ++OVS_VSWITCHD_STOP ++AT_CLEANUP ++ ++ ++AT_SETUP([mcast - check multicast per port flooding (unregistered flood disabled)]) ++OVS_VSWITCHD_START([]) ++ ++AT_CHECK([ ++ ovs-vsctl set bridge br0 \ ++ datapath_type=dummy \ ++ mcast_snooping_enable=true \ ++ other-config:mcast-snooping-disable-flood-unregistered=true ++], [0]) ++ ++AT_CHECK([ovs-ofctl add-flow br0 action=normal]) ++ ++AT_CHECK([ ++ ovs-vsctl add-port br0 p1 \ ++ -- set Interface p1 type=dummy other-config:hwaddr=aa:55:aa:55:00:01 ofport_request=1 \ ++ -- add-port br0 p2 \ ++ -- set Interface p2 type=dummy other-config:hwaddr=aa:55:aa:55:00:02 ofport_request=2 \ ++ -- add-port br0 p3 \ ++ -- set Interface p3 type=dummy other-config:hwaddr=aa:55:aa:55:00:03 ofport_request=3 \ ++], [0]) ++ ++ovs-appctl time/stop ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: drop ++]) ++ ++AT_CHECK([ovs-vsctl set port p2 other_config:mcast-snooping-flood=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast flood port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 2 ++]) ++ ++AT_CHECK([ovs-vsctl set port p3 other_config:mcast-snooping-flood=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:01:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"], [0], [dnl ++Flow: udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding to mcast flood port ++ -> mcast flood port is input port, dropping ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:01:01:01,nw_dst=224.1.1.1,nw_frag=no ++Datapath actions: 2 ++]) ++ ++OVS_VSWITCHD_STOP ++AT_CLEANUP ++ ++ ++AT_SETUP([mcast - check reports per port flooding]) ++OVS_VSWITCHD_START([]) ++ ++AT_CHECK([ ++ ovs-vsctl set bridge br0 \ ++ datapath_type=dummy \ ++ mcast_snooping_enable=true \ ++ other-config:mcast-snooping-disable-flood-unregistered=false ++], [0]) ++ ++AT_CHECK([ovs-ofctl add-flow br0 action=normal]) ++ ++AT_CHECK([ ++ ovs-vsctl add-port br0 p1 \ ++ -- set Interface p1 type=dummy other-config:hwaddr=aa:55:aa:55:00:01 ofport_request=1 \ ++ -- add-port br0 p2 \ ++ -- set Interface p2 type=dummy other-config:hwaddr=aa:55:aa:55:00:02 ofport_request=2 \ ++ -- add-port br0 p3 \ ++ -- set Interface p3 type=dummy other-config:hwaddr=aa:55:aa:55:00:03 ofport_request=3 \ ++], [0]) ++ ++ovs-appctl time/stop ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(1)" '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101'], [0], [dnl ++Flow: ip,in_port=1,vlan_tci=0x0000,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_src=172.16.34.30,nw_dst=224.1.1.1,nw_proto=2,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=18,tp_dst=20 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> learned that 00:0c:29:a0:27:a1 is on port p1 in VLAN 0 ++ -> multicast snooping learned that 224.1.1.1 is on port p1 in VLAN 0 ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,ip,in_port=1,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_proto=2,nw_frag=no ++Datapath actions: drop ++This flow is handled by the userspace slow path because it: ++ - Uses action(s) not supported by datapath. ++]) ++ ++AT_CHECK([ovs-vsctl set port p3 other_config:mcast-snooping-flood-reports=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(1)" '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101'], [0], [dnl ++Flow: ip,in_port=1,vlan_tci=0x0000,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_src=172.16.34.30,nw_dst=224.1.1.1,nw_proto=2,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=18,tp_dst=20 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding report to mcast flagged port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,ip,in_port=1,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_proto=2,nw_frag=no ++Datapath actions: 3 ++This flow is handled by the userspace slow path because it: ++ - Uses action(s) not supported by datapath. ++]) ++ ++AT_CHECK([ovs-vsctl set port p2 other_config:mcast-snooping-flood-reports=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(1)" '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101'], [0], [dnl ++Flow: ip,in_port=1,vlan_tci=0x0000,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_src=172.16.34.30,nw_dst=224.1.1.1,nw_proto=2,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=18,tp_dst=20 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding report to mcast flagged port ++ -> forwarding report to mcast flagged port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,ip,in_port=1,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_proto=2,nw_frag=no ++Datapath actions: 3,2 ++This flow is handled by the userspace slow path because it: ++ - Uses action(s) not supported by datapath. ++]) ++ ++AT_CHECK([ovs-vsctl set port p1 other_config:mcast-snooping-flood-reports=true]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(1)" '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101'], [0], [dnl ++Flow: ip,in_port=1,vlan_tci=0x0000,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_src=172.16.34.30,nw_dst=224.1.1.1,nw_proto=2,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=18,tp_dst=20 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding report to mcast flagged port ++ -> forwarding report to mcast flagged port ++ -> mcast port is input port, dropping the Report ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,ip,in_port=1,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_proto=2,nw_frag=no ++Datapath actions: 3,2 ++This flow is handled by the userspace slow path because it: ++ - Uses action(s) not supported by datapath. ++]) ++ ++# Change p2 ofport to force a ofbundle change and check that the mdb contains ++# no stale port. ++AT_CHECK([ovs-vsctl set interface p3 ofport_request=4]) ++ ++AT_CHECK([ovs-appctl ofproto/trace "in_port(1)" '01005E010101000C29A027A108004500001C000100004002CBAEAC10221EE001010112140CE9E0010101'], [0], [dnl ++Flow: ip,in_port=1,vlan_tci=0x0000,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_src=172.16.34.30,nw_dst=224.1.1.1,nw_proto=2,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=18,tp_dst=20 ++ ++bridge("br0") ++------------- ++ 0. priority 32768 ++ NORMAL ++ -> forwarding report to mcast flagged port ++ -> mcast port is input port, dropping the Report ++ -> forwarding report to mcast flagged port ++ ++Final flow: unchanged ++Megaflow: recirc_id=0,eth,ip,in_port=1,dl_src=00:0c:29:a0:27:a1,dl_dst=01:00:5e:01:01:01,nw_proto=2,nw_frag=no ++Datapath actions: 2,3 ++This flow is handled by the userspace slow path because it: ++ - Uses action(s) not supported by datapath. ++]) ++ ++OVS_VSWITCHD_STOP ++AT_CLEANUP ++ ++ + AT_SETUP([mcast - delete the port mdb when vlan configuration changed]) + OVS_VSWITCHD_START([]) + +@@ -216,3 +538,70 @@ AT_CHECK([ovs-appctl mdb/show br0], [0], [dnl ]) AT_CLEANUP diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec index 66705de..124d35a 100644 --- a/SPECS/openvswitch2.17.spec +++ b/SPECS/openvswitch2.17.spec @@ -63,7 +63,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.17.0 -Release: 136%{?dist} +Release: 137%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -749,6 +749,13 @@ exit 0 %endif %changelog +* Fri Nov 24 2023 Open vSwitch CI - 2.17.0-137 +- Merging upstream branch-2.17 [RH git: b3a98e2a19] + Commit list: + 1d3609a489 mcast-snooping: Flush flood and report ports when deleting interfaces. + df101fe1ea mcast-snooping: Test per port explicit flooding. + + * Wed Nov 01 2023 Open vSwitch CI - 2.17.0-136 - Merging upstream branch-2.17 [RH git: 83fa49d2bf] Commit list: