diff --git a/.ovn.metadata b/.ovn.metadata
index 5e00597..df4ddae 100644
--- a/.ovn.metadata
+++ b/.ovn.metadata
@@ -1,5 +1,5 @@
002450621b33c5690060345b0aac25bc2426d675 SOURCES/docutils-0.12.tar.gz
-5953db6f7d13eeaa4335f558659865c07abd3d95 SOURCES/openvswitch-ba159ee.tar.gz
-54b0b39b351e7b650d4de61ac8029b4b1186896c SOURCES/ovn-22.03.0.tar.gz
+18ee4650f5907758dbd949b7b82bfb029666d8f8 SOURCES/openvswitch-6f24c2b.tar.gz
+8fc7b574476db8f38307923fd6e476df9b65b009 SOURCES/ovn-22.06.0.tar.gz
d34f96421a86004aa5d26ecf975edefd09f948b1 SOURCES/Pygments-1.4.tar.gz
6beb30f18ffac3de7689b7fd63e9a8a7d9c8df3a SOURCES/Sphinx-1.1.3.tar.gz
diff --git a/SOURCES/ovn22.03.patch b/SOURCES/ovn22.03.patch
deleted file mode 100644
index ef85019..0000000
--- a/SOURCES/ovn22.03.patch
+++ /dev/null
@@ -1,1351 +0,0 @@
-diff --git a/AUTHORS.rst b/AUTHORS.rst
-index 8572c24c8..d3747f8d1 100644
---- a/AUTHORS.rst
-+++ b/AUTHORS.rst
-@@ -147,6 +147,7 @@ Fabrizio D'Angelo fdangelo@redhat.com
- Flavio Fernandes flavio@flaviof.com
- Flavio Leitner fbl@redhat.com
- Francesco Fusco ffusco@redhat.com
-+François Rigault frigo@amadeus.com
- Frank Wang wangpeihuixyz@126.com
- Frédéric Tobias Christ fchrist@live.de
- Frode Nordahl frode.nordahl@gmail.com
-diff --git a/NEWS b/NEWS
-index 9f3ce3cf3..15fa545d2 100644
---- a/NEWS
-+++ b/NEWS
-@@ -1,4 +1,7 @@
--OVN v22.03.0 - XX XXX XXXX
-+OVN v22.03.1 - xx xxx xxxx
-+--------------------------
-+
-+OVN v22.03.0 - 11 Mar 2022
- --------------------------
- - Refactor CoPP commands introducing a unique name index in CoPP NB table.
- Add following new CoPP commands to manage CoPP table:
-diff --git a/configure.ac b/configure.ac
-index 283381b4e..70f86e1f5 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -13,7 +13,7 @@
- # limitations under the License.
-
- AC_PREREQ(2.63)
--AC_INIT(ovn, 22.03.0, bugs@openvswitch.org)
-+AC_INIT(ovn, 22.03.1, bugs@openvswitch.org)
- AC_CONFIG_MACRO_DIR([m4])
- AC_CONFIG_AUX_DIR([build-aux])
- AC_CONFIG_HEADERS([config.h])
-diff --git a/controller-vtep/binding.c b/controller-vtep/binding.c
-index 01d5a16d2..1ee52b592 100644
---- a/controller-vtep/binding.c
-+++ b/controller-vtep/binding.c
-@@ -109,12 +109,10 @@ update_pb_chassis(const struct sbrec_port_binding *port_binding_rec,
- port_binding_rec->chassis->name,
- chassis_rec->name);
- }
--
- sbrec_port_binding_set_chassis(port_binding_rec, chassis_rec);
-- if (port_binding_rec->n_up) {
-- bool up = true;
-- sbrec_port_binding_set_up(port_binding_rec, &up, 1);
-- }
-+ } else if (port_binding_rec->n_up) {
-+ bool up = true;
-+ sbrec_port_binding_set_up(port_binding_rec, &up, 1);
- }
- }
-
-diff --git a/controller/binding.c b/controller/binding.c
-index 4d62b0858..1259e6b3b 100644
---- a/controller/binding.c
-+++ b/controller/binding.c
-@@ -481,6 +481,16 @@ remove_related_lport(const struct sbrec_port_binding *pb,
- }
- }
-
-+static void
-+delete_active_pb_ras_pd(const struct sbrec_port_binding *pb,
-+ struct shash *ras_pd_map)
-+{
-+ struct pb_ld_binding *ras_pd =
-+ shash_find_and_delete(ras_pd_map, pb->logical_port);
-+
-+ free(ras_pd);
-+}
-+
- static void
- update_active_pb_ras_pd(const struct sbrec_port_binding *pb,
- struct hmap *local_datapaths,
-@@ -2251,6 +2261,9 @@ binding_handle_port_binding_changes(struct binding_ctx_in *b_ctx_in,
- continue;
- }
-
-+ delete_active_pb_ras_pd(pb, b_ctx_out->local_active_ports_ipv6_pd);
-+ delete_active_pb_ras_pd(pb, b_ctx_out->local_active_ports_ras);
-+
- enum en_lport_type lport_type = get_lport_type(pb);
-
- struct binding_lport *b_lport =
-diff --git a/controller/ofctrl.c b/controller/ofctrl.c
-index a7c2d2011..3b9d71733 100644
---- a/controller/ofctrl.c
-+++ b/controller/ofctrl.c
-@@ -943,7 +943,12 @@ link_installed_to_desired(struct installed_flow *i, struct desired_flow *d)
- break;
- }
- }
-- ovs_list_insert(&f->installed_ref_list_node, &d->installed_ref_list_node);
-+ if (!f) {
-+ ovs_list_insert(&i->desired_refs, &d->installed_ref_list_node);
-+ } else {
-+ ovs_list_insert(&f->installed_ref_list_node,
-+ &d->installed_ref_list_node);
-+ }
- d->installed_flow = i;
- return installed_flow_get_active(i) == d;
- }
-@@ -2324,7 +2329,20 @@ deleted_flow_lookup(struct hmap *deleted_flows, struct ovn_flow *target)
- && f->cookie == target->cookie
- && ofpacts_equal(f->ofpacts, f->ofpacts_len, target->ofpacts,
- target->ofpacts_len)) {
-- return d;
-+ /* del_f must have been installed, otherwise it should have
-+ * been removed during track_flow_del. */
-+ ovs_assert(d->installed_flow);
-+
-+ /* Now we also need to make sure the desired flow being
-+ * added/updated has exact same action and cookie as the installed
-+ * flow of d. Otherwise, don't merge them, so that the
-+ * installed flow can be updated later. */
-+ struct ovn_flow *f_i = &d->installed_flow->flow;
-+ if (f_i->cookie == target->cookie
-+ && ofpacts_equal(f_i->ofpacts, f_i->ofpacts_len,
-+ target->ofpacts, target->ofpacts_len)) {
-+ return d;
-+ }
- }
- }
- return NULL;
-@@ -2353,10 +2371,6 @@ merge_tracked_flows(struct ovn_desired_flow_table *flow_table)
- continue;
- }
-
-- /* del_f must have been installed, otherwise it should have been
-- * removed during track_flow_add_or_modify. */
-- ovs_assert(del_f->installed_flow);
--
- if (!f->installed_flow) {
- /* f is not installed yet. */
- replace_installed_to_desired(del_f->installed_flow, del_f, f);
-@@ -2665,6 +2679,13 @@ ofctrl_put(struct ovn_desired_flow_table *lflow_table,
- EXTEND_TABLE_FOR_EACH_INSTALLED (m_installed, next_meter, meters) {
- /* Delete the meter. */
- ofctrl_meter_bands_erase(m_installed, &msgs);
-+ if (!strncmp(m_installed->name, "__string: ", 10)) {
-+ struct ofputil_meter_mod mm = {
-+ .command = OFPMC13_DELETE,
-+ .meter = { .meter_id = m_installed->table_id },
-+ };
-+ add_meter_mod(&mm, &msgs);
-+ }
- ovn_extend_table_remove_existing(meters, m_installed);
- }
-
-diff --git a/controller/pinctrl.c b/controller/pinctrl.c
-index 25b37ee88..2f718aca7 100644
---- a/controller/pinctrl.c
-+++ b/controller/pinctrl.c
-@@ -5523,7 +5523,7 @@ get_localnet_vifs_l3gwports(
- }
- const struct sbrec_port_binding *pb
- = lport_lookup_by_name(sbrec_port_binding_by_name, iface_id);
-- if (!pb) {
-+ if (!pb || pb->chassis != chassis) {
- continue;
- }
- struct local_datapath *ld
-@@ -5554,7 +5554,7 @@ get_localnet_vifs_l3gwports(
- sbrec_port_binding_index_set_datapath(target, ld->datapath);
- SBREC_PORT_BINDING_FOR_EACH_EQUAL (pb, target,
- sbrec_port_binding_by_datapath) {
-- if (!strcmp(pb->type, "l3gateway")
-+ if ((!strcmp(pb->type, "l3gateway") && pb->chassis == chassis)
- || !strcmp(pb->type, "patch")) {
- sset_add(local_l3gw_ports, pb->logical_port);
- }
-@@ -5781,7 +5781,8 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn,
- const struct sbrec_port_binding *pb = lport_lookup_by_name(
- sbrec_port_binding_by_name, iface_id);
- if (pb) {
-- send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip,
-+ send_garp_rarp_update(ovnsb_idl_txn,
-+ sbrec_mac_binding_by_lport_ip,
- local_datapaths, pb, &nat_addresses);
- }
- }
-diff --git a/debian/changelog b/debian/changelog
-index f1167591b..18a1a042e 100644
---- a/debian/changelog
-+++ b/debian/changelog
-@@ -1,3 +1,9 @@
-+OVN (22.03.1-1) unstable; urgency=low
-+ [ OVN team ]
-+ * New upstream version
-+
-+ -- OVN team put_arp(inport, arp.spa, arp.sha); next;
-
-
-+ nd_na &&
-+ nd.tll == 0
and applies the action
-+ put_nd(inport, nd.target, eth.src); next;
-+ nd_na
and
- applies the action
-@@ -4452,7 +4458,8 @@ nd_ns {
- to change the source IP address of a packet from an IP address of
- A or to change the source IP address of a packet that
- belongs to network A to B, a flow matches
-- ip && ip4.src == A
with an action
-+ ip && ip4.src == A &&
-+ (!ct.trk || !ct.rpl)
with an action
- ct_snat(B);
. The priority of the flow
- is calculated based on the mask of A, with matches
- having larger masks getting higher priorities. If the NAT rule is
-diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
-index 3fb854a37..821eb03cc 100644
---- a/rhel/ovn-fedora.spec.in
-+++ b/rhel/ovn-fedora.spec.in
-@@ -323,7 +323,7 @@ ln -sf ovn_detrace.py %{_bindir}/ovn-detrace
- %if %{with libcapng}
- if [ $1 -eq 1 ]; then
- sed -i 's:^#OVN_USER_ID=:OVN_USER_ID=:' %{_sysconfdir}/sysconfig/ovn
-- sed -i 's:\(.*su\).*:\1 ovn ovn:' %{_sysconfdir}/logrotate.d/ovn
-+ sed -i 's:\(.*su\).*:\1 openvswitch openvswitch:' %{_sysconfdir}/logrotate.d/ovn
- fi
- %endif
-
-diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
-index 3865003bf..b7dfcd151 100644
---- a/tests/ovn-northd.at
-+++ b/tests/ovn-northd.at
-@@ -1030,7 +1030,7 @@ AT_CHECK([grep -e "lr_out_snat" drflows | sed 's/table=../table=??/' | sort], [0
- AT_CHECK([grep -e "lr_out_snat" crflows | sed 's/table=../table=??/' | sort], [0], [dnl
- table=??(lr_out_snat ), priority=0 , match=(1), action=(next;)
- table=??(lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $allowed_range), action=(ct_snat(172.16.1.1);)
-+ table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $allowed_range && (!ct.trk || !ct.rpl)), action=(ct_snat(172.16.1.1);)
- ])
-
-
-@@ -1062,7 +1062,7 @@ AT_CHECK([grep -e "lr_out_snat" drflows2 | sed 's/table=../table=??/' | sort], [
- AT_CHECK([grep -e "lr_out_snat" crflows2 | sed 's/table=../table=??/' | sort], [0], [dnl
- table=??(lr_out_snat ), priority=0 , match=(1), action=(next;)
- table=??(lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11), action=(ct_snat(172.16.1.1);)
-+ table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.16.1.1);)
- table=??(lr_out_snat ), priority=35 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $disallowed_range), action=(next;)
- ])
-
-@@ -1091,7 +1091,7 @@ AT_CHECK([grep -e "lr_out_snat" drflows3 | sed 's/table=../table=??/' | sort], [
- AT_CHECK([grep -e "lr_out_snat" crflows3 | sed 's/table=../table=??/' | sort], [0], [dnl
- table=??(lr_out_snat ), priority=0 , match=(1), action=(next;)
- table=??(lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $allowed_range), action=(ct_snat(172.16.1.2);)
-+ table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $allowed_range && (!ct.trk || !ct.rpl)), action=(ct_snat(172.16.1.2);)
- ])
-
- # Stateful FIP with DISALLOWED_IPs
-@@ -1120,7 +1120,7 @@ AT_CHECK([grep -e "lr_out_snat" drflows4 | sed 's/table=../table=??/' | sort], [
- AT_CHECK([grep -e "lr_out_snat" crflows4 | sed 's/table=../table=??/' | sort], [0], [dnl
- table=??(lr_out_snat ), priority=0 , match=(1), action=(next;)
- table=??(lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11), action=(ct_snat(172.16.1.2);)
-+ table=??(lr_out_snat ), priority=33 , match=(ip && ip4.src == 50.0.0.11 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.16.1.2);)
- table=??(lr_out_snat ), priority=35 , match=(ip && ip4.src == 50.0.0.11 && ip4.dst == $disallowed_range), action=(next;)
- ])
-
-@@ -3447,7 +3447,7 @@ ls_copp_uuid=$(fetch_column nb:Logical_Switch copp)
- AT_CHECK([test "$ls_copp_uuid" = "$copp_uuid"])
-
- check ovn-nbctl --wait=hv copp-add $copp_uuid igmp meter0
--AT_CHECK([ovn-nbctl copp-list copp0], [0], [dnl
-+AT_CHECK([ovn-nbctl copp-list copp0 | sort], [0], [dnl
- arp: meter0
- igmp: meter0
- ])
-@@ -5140,11 +5140,12 @@ AT_CHECK([grep "lr_out_post_undnat" lr0flows | sed 's/table=./table=?/' | sort],
- AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
- table=? (lr_out_snat ), priority=0 , match=(1), action=(next;)
- table=? (lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24), action=(ct_snat(172.168.0.10);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10), action=(ct_snat(172.168.0.30);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3), action=(ct_snat(172.168.0.20);)
-+ table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.10);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.30);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.20);)
- ])
-
-+
- # Set lb force snat logical router.
- check ovn-nbctl --wait=sb set logical_router lr0 options:lb_force_snat_ip="router_ip"
- check ovn-nbctl --wait=sb sync
-@@ -5201,9 +5202,9 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-public"), action=(ct_snat(172.168.0.10);)
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-sw0"), action=(ct_snat(10.0.0.1);)
- table=? (lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24), action=(ct_snat(172.168.0.10);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10), action=(ct_snat(172.168.0.30);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3), action=(ct_snat(172.168.0.20);)
-+ table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.10);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.30);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.20);)
- ])
-
- # Add a LB VIP same as router ip.
-@@ -5266,9 +5267,9 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-public"), action=(ct_snat(172.168.0.10);)
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-sw0"), action=(ct_snat(10.0.0.1);)
- table=? (lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24), action=(ct_snat(172.168.0.10);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10), action=(ct_snat(172.168.0.30);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3), action=(ct_snat(172.168.0.20);)
-+ table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.10);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.30);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.20);)
- ])
-
- # Add IPv6 router port and LB.
-@@ -5346,9 +5347,9 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip6 && outport == "lr0-public"), action=(ct_snat(def0::10);)
- table=? (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip6 && outport == "lr0-sw0"), action=(ct_snat(aef0::1);)
- table=? (lr_out_snat ), priority=120 , match=(nd_ns), action=(next;)
-- table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24), action=(ct_snat(172.168.0.10);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10), action=(ct_snat(172.168.0.30);)
-- table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3), action=(ct_snat(172.168.0.20);)
-+ table=? (lr_out_snat ), priority=25 , match=(ip && ip4.src == 10.0.0.0/24 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.10);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.10 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.30);)
-+ table=? (lr_out_snat ), priority=33 , match=(ip && ip4.src == 10.0.0.3 && (!ct.trk || !ct.rpl)), action=(ct_snat(172.168.0.20);)
- ])
-
- check ovn-nbctl lrp-del lr0-sw0
-@@ -5804,6 +5805,12 @@ AT_CHECK([grep lr_in_gw_redirect lrflows | grep cr-DR | sed 's/table=../table=??
- table=??(lr_in_gw_redirect ), priority=50 , match=(outport == "DR-S3"), action=(outport = "cr-DR-S3"; next;)
- ])
-
-+# Check that ovn-northd logs a warning when trying to configure NAT
-+# on the router with multiple distributed gw ports. Such configurations are
-+# not supported yet.
-+check ovn-nbctl lr-nat-add DR dnat_and_snat 42.42.42.1 20.0.0.2
-+AT_CHECK([grep -q 'NAT is configured on logical router DR, which has 2 distributed gateway ports. NAT is not supported yet when there is more than one distributed gateway port on the router.' northd/ovn-northd.log], [0])
-+
- AT_CLEANUP
- ])
-
-@@ -6426,3 +6433,28 @@ AT_CHECK([grep -e "ls_in_stateful" lsflows | sed 's/table=../table=??/' | sort],
-
- AT_CLEANUP
- ])
-+
-+OVN_FOR_EACH_NORTHD([
-+AT_SETUP([LR neighbor lookup and learning flows])
-+ovn_start
-+
-+# Create logical routers
-+ovn-nbctl --wait=sb lr-add lr0
-+
-+ovn-sbctl dump-flows lr0 > lrflows
-+AT_CAPTURE_FILE([lrflows])
-+
-+AT_CHECK([cat lrflows | grep -e lr_in_lookup_neighbor -e lr_in_learn_neighbor | sort], [0], [dnl
-+ table=1 (lr_in_lookup_neighbor), priority=0 , match=(1), action=(reg9[[2]] = 1; next;)
-+ table=1 (lr_in_lookup_neighbor), priority=100 , match=(arp.op == 2), action=(reg9[[2]] = lookup_arp(inport, arp.spa, arp.sha); next;)
-+ table=1 (lr_in_lookup_neighbor), priority=100 , match=(nd_na), action=(reg9[[2]] = lookup_nd(inport, nd.target, nd.tll); next;)
-+ table=1 (lr_in_lookup_neighbor), priority=100 , match=(nd_ns), action=(reg9[[2]] = lookup_nd(inport, ip6.src, nd.sll); next;)
-+ table=2 (lr_in_learn_neighbor), priority=100 , match=(reg9[[2]] == 1), action=(next;)
-+ table=2 (lr_in_learn_neighbor), priority=90 , match=(arp), action=(put_arp(inport, arp.spa, arp.sha); next;)
-+ table=2 (lr_in_learn_neighbor), priority=90 , match=(nd_na), action=(put_nd(inport, nd.target, nd.tll); next;)
-+ table=2 (lr_in_learn_neighbor), priority=90 , match=(nd_ns), action=(put_nd(inport, ip6.src, nd.sll); next;)
-+ table=2 (lr_in_learn_neighbor), priority=95 , match=(nd_na && nd.tll == 0), action=(put_nd(inport, nd.target, eth.src); next;)
-+])
-+
-+AT_CLEANUP
-+])
-diff --git a/tests/ovn.at b/tests/ovn.at
-index 4f65d1ecd..4ee9aebc9 100644
---- a/tests/ovn.at
-+++ b/tests/ovn.at
-@@ -8588,6 +8588,114 @@ OVN_CLEANUP([hv1])
- AT_CLEANUP
- ])
-
-+OVN_FOR_EACH_NORTHD([
-+AT_SETUP([send gratuitous arp for l3gateway only on selected chassis])
-+ovn_start
-+
-+# Create logical switch
-+ovn-nbctl ls-add ls0
-+# Create gateway router
-+ovn-nbctl lr-add lr0
-+# Add router port to gateway router
-+ovn-nbctl lrp-add lr0 lr0-ls0 f0:00:00:00:00:01 192.168.0.1/24
-+ovn-nbctl lsp-add ls0 ls0-lr0 -- set Logical_Switch_Port ls0-lr0 \
-+ type=router options:router-port=lr0-ls0 addresses='"f0:00:00:00:00:01"'
-+
-+# Create a localnet port.
-+ovn-nbctl lsp-add ls0 ln_port
-+ovn-nbctl lsp-set-addresses ln_port unknown
-+ovn-nbctl lsp-set-type ln_port localnet
-+ovn-nbctl --wait=hv lsp-set-options ln_port network_name=physnet1
-+
-+# Prepare packets
-+touch empty_expected
-+echo "fffffffffffff0000000000108060001080006040001f00000000001c0a80001000000000000c0a80001" > arp_expected
-+
-+net_add n1
-+sim_add hv1
-+as hv1
-+ovs-vsctl \
-+ -- add-br br-phys \
-+ -- add-br br-eth0
-+
-+ovn_attach n1 br-phys 192.168.0.10
-+
-+AT_CHECK([ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=physnet1:br-eth0])
-+AT_CHECK([ovs-vsctl add-port br-eth0 snoopvif -- set Interface snoopvif options:tx_pcap=hv1/snoopvif-tx.pcap options:rxq_pcap=hv1/snoopvif-rx.pcap])
-+
-+sim_add hv2
-+as hv2
-+ovs-vsctl \
-+ -- add-br br-phys \
-+ -- add-br br-eth0
-+
-+ovn_attach n1 br-phys 192.168.0.20
-+
-+AT_CHECK([ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=physnet1:br-eth0])
-+AT_CHECK([ovs-vsctl add-port br-eth0 snoopvif -- set Interface snoopvif options:tx_pcap=hv2/snoopvif-tx.pcap options:rxq_pcap=hv2/snoopvif-rx.pcap])
-+
-+ovn-sbctl dump-flows > sbflows
-+AT_CAPTURE_FILE([sbflows])
-+
-+# Wait until the patch ports are created in hv1 and hv2 to connect br-int to br-eth0
-+AT_CHECK([ovn-nbctl set logical_router lr0 options:chassis=hv1])
-+OVS_WAIT_UNTIL([test 1 = `as hv1 ovs-vsctl show | \
-+grep "Port patch-br-int-to-ln_port" | wc -l`])
-+AT_CHECK([ovn-nbctl set logical_router lr0 options:chassis=hv2])
-+OVS_WAIT_UNTIL([test 1 = `as hv2 ovs-vsctl show | \
-+grep "Port patch-br-int-to-ln_port" | wc -l`])
-+
-+# Temporarily remove lr0 chassis
-+AT_CHECK([ovn-nbctl remove logical_router lr0 options chassis])
-+
-+reset_pcap_file() {
-+ local hv=$1
-+ local iface=$2
-+ local pcap_file=$3
-+ as $hv
-+ ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
-+options:rxq_pcap=dummy-rx.pcap
-+ rm -f ${pcap_file}*.pcap
-+ ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
-+options:rxq_pcap=${pcap_file}-rx.pcap
-+}
-+
-+reset_pcap_file hv1 snoopvif hv1/snoopvif
-+reset_pcap_file hv2 snoopvif hv2/snoopvif
-+
-+hv1_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv1)
-+AT_CHECK([ovn-nbctl set logical_router lr0 options:chassis=hv1])
-+OVS_WAIT_UNTIL([
-+ ls0_lr0=$(ovn-sbctl --bare --columns chassis list port_binding ls0-lr0)
-+ test "$ls0_lr0" = $hv1_uuid
-+])
-+
-+sleep 2
-+OVN_CHECK_PACKETS_CONTAIN([hv1/snoopvif-tx.pcap], [arp_expected])
-+OVN_CHECK_PACKETS([hv2/snoopvif-tx.pcap], [empty_expected])
-+
-+# Temporarily remove lr0 chassis
-+AT_CHECK([ovn-nbctl remove logical_router lr0 options chassis])
-+
-+reset_pcap_file hv1 snoopvif hv1/snoopvif
-+reset_pcap_file hv2 snoopvif hv2/snoopvif
-+
-+hv2_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv2)
-+AT_CHECK([ovn-nbctl set logical_router lr0 options:chassis=hv2])
-+OVS_WAIT_UNTIL([
-+ ls0_lr0=$(ovn-sbctl --bare --columns chassis list port_binding ls0-lr0)
-+ test "$ls0_lr0" = $hv2_uuid
-+])
-+
-+sleep 2
-+OVN_CHECK_PACKETS_CONTAIN([hv2/snoopvif-tx.pcap], [arp_expected])
-+OVN_CHECK_PACKETS([hv1/snoopvif-tx.pcap], [empty_expected])
-+
-+OVN_CLEANUP([hv1],[hv2])
-+
-+AT_CLEANUP
-+])
-+
- OVN_FOR_EACH_NORTHD([
- AT_SETUP([send gratuitous arp with nat-addresses router in localnet])
- ovn_start
-@@ -9403,6 +9511,10 @@ check ovn-nbctl --wait=hv qos-add lsw0 to-lport 1002 'inport=="lp2" && is_chassi
- AT_CHECK([as hv ovs-ofctl dump-meters br-int -O OpenFlow13 | grep meter | wc -l], [0], [4
- ])
-
-+check ovn-nbctl qos-del lsw0
-+AT_CHECK([as hv ovs-ofctl dump-meters br-int -O OpenFlow13 | grep meter | wc -l], [0], [0
-+])
-+
- OVN_CLEANUP([hv])
- AT_CLEANUP
- ])
-@@ -13988,6 +14100,99 @@ OVN_CLEANUP([hv1],[hv2])
- AT_CLEANUP
- ])
-
-+OVN_FOR_EACH_NORTHD([
-+AT_SETUP([garps disabled when port no longer bound to chassis])
-+ovn_start
-+
-+net_add n1
-+for i in 1 2; do
-+ sim_add hv$i
-+ as hv$i
-+ check ovs-vsctl add-br br-phys
-+ ovn_attach n1 br-phys 192.168.0.$i
-+ check ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys
-+done
-+
-+check ovn-nbctl ls-add ls0
-+check ovn-nbctl lsp-add ls0 port
-+check ovn-nbctl lsp-set-addresses port "00:00:00:00:00:01 10.0.0.1"
-+
-+check ovn-nbctl lsp-add ls0 public
-+check ovn-nbctl lsp-set-addresses public unknown
-+check ovn-nbctl lsp-set-type public localnet
-+check ovn-nbctl lsp-set-options public network_name=phys
-+
-+for hv in hv1 hv2; do
-+ as $hv check ovs-vsctl -- add-port br-int port -- \
-+ set Interface port external-ids:iface-id=port \
-+ options:tx_pcap=$hv/port-tx.pcap \
-+ options:rxq_pcap=$hv/port-rx.pcap
-+done
-+
-+reset_pcap_file() {
-+ local hv=$1
-+ local iface=$2
-+ local pcap_file=$3
-+ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
-+ options:rxq_pcap=dummy-rx.pcap
-+ check rm -f ${pcap_file}*.pcap
-+ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
-+ options:rxq_pcap=${pcap_file}-rx.pcap
-+}
-+
-+reset_env() {
-+ reset_pcap_file hv1 br-phys_n1 hv1/br-phys_n1
-+ reset_pcap_file hv2 br-phys_n1 hv2/br-phys_n1
-+
-+ for port in hv1/n1 hv2/n1; do
-+ : > $port.expected
-+ done
-+}
-+
-+for hv in hv1 hv2; do
-+ wait_row_count Chassis 1 name=$hv
-+done
-+hv1_uuid=$(fetch_column Chassis _uuid name=hv1)
-+hv2_uuid=$(fetch_column Chassis _uuid name=hv2)
-+
-+OVN_POPULATE_ARP
-+
-+# Activate port on each hv giving a chance to each chassis to enable garps
-+check ovn-nbctl lsp-set-options port requested-chassis=hv1
-+wait_column "$hv1_uuid" Port_Binding chassis logical_port=port
-+wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=port
-+wait_for_ports_up
-+reset_env
-+
-+# give chassis some time to generate garps
-+sleep 2
-+
-+expected_garp=ffffffffffff000000000001080600010800060400010000000000010a0000010000000000000a000001
-+
-+# check hv1 sends garps and hv2 doesn't
-+echo $expected_garp >> hv1/n1.expected
-+OVN_CHECK_PACKETS_CONTAIN([hv1/br-phys_n1-tx.pcap], [hv1/n1.expected])
-+OVN_CHECK_PACKETS([hv2/br-phys_n1-tx.pcap], [hv2/n1.expected])
-+
-+check ovn-nbctl lsp-set-options port requested-chassis=hv2
-+wait_column "$hv2_uuid" Port_Binding chassis logical_port=port
-+wait_column "$hv2_uuid" Port_Binding requested_chassis logical_port=port
-+wait_for_ports_up
-+reset_env
-+
-+# give chassis some time to generate garps
-+sleep 2
-+
-+# check hv2 sends garps and hv1 doesn't
-+echo $expected_garp >> hv2/n1.expected
-+OVN_CHECK_PACKETS([hv1/br-phys_n1-tx.pcap], [hv1/n1.expected])
-+OVN_CHECK_PACKETS_CONTAIN([hv2/br-phys_n1-tx.pcap], [hv2/n1.expected])
-+
-+OVN_CLEANUP([hv1],[hv2])
-+
-+AT_CLEANUP
-+])
-+
- OVN_FOR_EACH_NORTHD([
- AT_SETUP([IPv6 periodic RA disabled for localnet adjacent switch ports])
- ovn_start
-@@ -15243,6 +15448,92 @@ OVN_CLEANUP([hv1])
- AT_CLEANUP
- ])
-
-+# This test ensures that the incremental flow installation works well when
-+# handling update->delete->add/update for the same OVS flow.
-+OVN_FOR_EACH_NORTHD([
-+AT_SETUP([ACL conjunction append and reprocess])
-+ovn_start
-+
-+net_add n1
-+sim_add hv1
-+as hv1
-+check ovs-vsctl add-br br-phys
-+ovn_attach n1 br-phys 192.168.0.1
-+
-+# Setup the desired state:
-+# - Two ACLs, each matches its own port-group (pg1 & pg2), and matches the same
-+# set of IP addresses.
-+# - pg1 includes p1, p2, p3
-+# - pg2 includes p4, p5
-+check ovn-nbctl ls-add sw
-+check ovn-nbctl lsp-add sw p1 -- lsp-set-addresses p1 "00:00:00:00:00:02 192.168.0.2"
-+check ovn-nbctl lsp-add sw p2 -- lsp-set-addresses p2 "00:00:00:00:00:03 192.168.0.3"
-+check ovn-nbctl lsp-add sw p3 -- lsp-set-addresses p3 "00:00:00:00:00:04 192.168.0.4"
-+check ovn-nbctl lsp-add sw p4 -- lsp-set-addresses p4 "00:00:00:00:00:05 192.168.0.5"
-+check ovn-nbctl lsp-add sw p5 -- lsp-set-addresses p5 "00:00:00:00:00:06 192.168.0.6"
-+check ovn-nbctl pg-add pg1 p1 p2 p3
-+check ovn-nbctl pg-add pg2 p4 p5
-+check ovs-vsctl add-port br-int p1 -- set Interface p1 external_ids:iface-id=p1
-+check ovs-vsctl add-port br-int p2 -- set Interface p2 external_ids:iface-id=p2
-+check ovs-vsctl add-port br-int p3 -- set Interface p3 external_ids:iface-id=p3
-+check ovs-vsctl add-port br-int p4 -- set Interface p4 external_ids:iface-id=p4
-+check ovs-vsctl add-port br-int p5 -- set Interface p5 external_ids:iface-id=p5
-+check ovn-nbctl acl-add pg1 to-lport 1000 "outport==@pg1 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}" allow
-+check ovn-nbctl acl-add pg2 to-lport 1000 "outport==@pg2 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}" allow
-+check ovn-nbctl --wait=hv sync
-+
-+# Now we should have two flows with combined conjunctions.
-+OVS_WAIT_UNTIL([test 2 = `as hv1 ovs-ofctl dump-flows br-int | \
-+grep conjunction.*conjunction | wc -l`])
-+
-+
-+# Test the scenario 10 times to give enough chance to hit the
-+# "update->delete->add/update" scenario, because we can't decide the order of
-+# change handling inside ovn-controller.
-+for i in $(seq 10); do
-+# Unbind the p3 and p5, the combined conjunctions should be gone.
-+ovs-vsctl del-port br-int p3
-+ovs-vsctl del-port br-int p5
-+OVS_WAIT_UNTIL([test 0 = `as hv1 ovs-ofctl dump-flows br-int | \
-+grep conjunction.*conjunction | wc -l`])
-+
-+# Delete and re-add the ACLs, just to bring some randomness in the lflow
-+# processing order, so that there is a chance that the order of adding and
-+# appending are the same before & after the flow deletion, so that the
-+# generated combined conjunctions are the same before & after the flow
-+# deletion. (If the order is different, the combined conjunctions order is
-+# different and the action comparison would fail, so won't trigger the tracked
-+# flow merging. We want to make sure that we test the merging scenario)
-+ovn-nbctl acl-del pg1 to-lport 1000 "outport==@pg1 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}"
-+ovn-nbctl acl-del pg2 to-lport 1000 "outport==@pg2 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}"
-+ovn-nbctl acl-add pg1 to-lport 1000 "outport==@pg1 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}" allow
-+ovn-nbctl acl-add pg2 to-lport 1000 "outport==@pg2 && ip4 && ip4.src == {10.0.0.1, 10.0.0.2}" allow
-+ovn-nbctl --wait=hv sync
-+
-+# Now re-bind p3 and p5 in the same transaction, so that pg1 and pg2 update are
-+# handled in the same I-P engine run. The order of pg1 and pg2 can be random.
-+# If the order is pg2 -> pg1, then it should trigger the OVS flow
-+# "update->delete->add/update" scenario:
-+# 1) when pg2 update is handled, the ACL-2 would append conjunctions to
-+# the conjunction flows of ACL-1
-+# 2) when pg1 update is handled, it would flood remove flows of both ACL-1 and
-+# ACL-2, including the "appended" conjunction flows. And then reprocess
-+# ACL-1 and ACL-2 would re-add and re-append the conjunction flows with
-+# combined conjunctions.
-+ovs-vsctl add-port br-int p3 -- set Interface p3 external_ids:iface-id=p3 -- \
-+ add-port br-int p5 -- set Interface p5 external_ids:iface-id=p5
-+ovn-nbctl --wait=hv sync
-+
-+# Now making sure we end up with two combined conjunctions.
-+OVS_WAIT_UNTIL([test 2 = `as hv1 ovs-ofctl dump-flows br-int | \
-+grep conjunction.*conjunction | wc -l`])
-+
-+done
-+
-+OVN_CLEANUP([hv1])
-+AT_CLEANUP
-+])
-+
- OVN_FOR_EACH_NORTHD([
- AT_SETUP([Superseding ACLs with conjunction])
- ovn_start
-diff --git a/tests/system-ovn.at b/tests/system-ovn.at
-index c4a2c39f6..018dcea2a 100644
---- a/tests/system-ovn.at
-+++ b/tests/system-ovn.at
-@@ -6922,10 +6922,10 @@ p = IP(src="192.168.1.2", dst="192.168.1.1") / UDP(dport = 12345) / Raw(b"X"*64)
- send (p, iface='sw01', loop = 0, verbose = 0, count = 20)
- EOF
-
--# 1pps + 1 burst size
-+# 1pps
- OVS_WAIT_UNTIL([
- n_reject=$(grep unreachable reject.pcap | wc -l)
-- test "${n_reject}" = "2"
-+ test "${n_reject}" = "1"
- ])
- kill $(pidof tcpdump)
- rm -f reject.pcap
-@@ -6938,10 +6938,10 @@ p = IP(src="192.168.1.2", dst="192.168.1.1") / UDP(dport = 12345) / Raw(b"X"*64)
- send (p, iface='sw01', loop = 0, verbose = 0, count = 100)
- EOF
-
--# 10pps + 1 burst size
-+# 10pps
- OVS_WAIT_UNTIL([
- n_reject=$(grep unreachable reject.pcap | wc -l)
-- test "${n_reject}" = "20"
-+ test "${n_reject}" = "10"
- ])
-
- kill $(pidof tcpdump)
-@@ -6974,10 +6974,10 @@ p = IP(src="192.168.1.2", dst="172.16.1.100") / TCP(dport = 80, flags="S") / Raw
- send (p, iface='sw01', loop = 0, verbose = 0, count = 100)
- EOF
-
--# 1pps + 1 burst size
-+# 1pps
- OVS_WAIT_UNTIL([
- n_arp=$(grep ARP arp.pcap | wc -l)
-- test "${n_arp}" = "2"
-+ test "${n_arp}" = "1"
- ])
- kill $(pidof tcpdump)
-
-@@ -6994,10 +6994,10 @@ p = IP(src="192.168.1.2", dst="172.16.1.100", ttl=1) / TCP(dport = 8080, flags="
- send (p, iface='sw01', loop = 0, verbose = 0, count = 100)
- EOF
-
--# 1pps + 1 burst size
-+# 1pps
- OVS_WAIT_UNTIL([
- n_icmp=$(grep ICMP icmp.pcap | wc -l)
-- test "${n_icmp}" = "2"
-+ test "${n_icmp}" = "1"
- ])
- kill $(pidof tcpdump)
-
-@@ -7010,7 +7010,7 @@ bfd: bfd-meter
-
- check ovn-nbctl --bfd lr-route-add R1 240.0.0.0/8 172.16.1.50 rp-public
- printf "%08x" $(ovn-sbctl get bfd . disc) > /tmp/disc
--NS_EXEC([server], [tcpdump -l -n -i s1 udp port 3784 -Q in > bfd.pcap &])
-+NS_EXEC([server], [tcpdump -l -nn -i s1 udp port 3784 and ip[[29]]==0x90 -Q in > bfd.pcap &])
- ip netns exec server scapy -H <<-EOF
- import binascii
- f = open("/tmp/disc", "r")
-@@ -7023,10 +7023,10 @@ f.close()
- EOF
- rm /tmp/disc
-
--# 1pps + 1 burst size
-+# 1pps
- OVS_WAIT_UNTIL([
-- n_tcp_rst=$(grep Final bfd.pcap | wc -l)
-- test "${n_tcp_rst}" = "2"
-+ n_bfd=$(grep 3784 bfd.pcap | wc -l)
-+ test "${n_bfd}" = "1"
- ])
- kill $(pidof tcpdump)
-
-@@ -7992,3 +7992,122 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
-
- AT_CLEANUP
- ])
-+
-+OVN_FOR_EACH_NORTHD([
-+AT_SETUP([East-West traffic with gateway router if DNAT configured])
-+AT_KEYWORDS([ovnnat])
-+
-+CHECK_CONNTRACK()
-+CHECK_CONNTRACK_NAT()
-+ovn_start
-+OVS_TRAFFIC_VSWITCHD_START()
-+ADD_BR([br-int])
-+# Set external-ids in br-int needed for ovn-controller
-+ovs-vsctl \
-+ -- set Open_vSwitch . external-ids:system-id=hv1 \
-+ -- set Open_vSwitch . external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb.sock \
-+ -- set Open_vSwitch . external-ids:ovn-encap-type=geneve \
-+ -- set Open_vSwitch . external-ids:ovn-encap-ip=169.0.0.1 \
-+ -- set bridge br-int fail-mode=secure other-config:disable-in-band=true
-+
-+# Start ovn-controller
-+start_daemon ovn-controller
-+# Logical network:
-+# One LR - R1 has two switches: sw0 and sw1
-+# sw0 -- R1 -- sw1
-+# Logical port 'sw01' in switch 'sw0'.
-+# Logical port 'sw11' in switch 'sw1'.
-+# nc server running in sw01
-+# nc client running on sw11
-+
-+check ovn-nbctl lr-add R1
-+check ovn-nbctl ls-add sw0
-+check ovn-nbctl ls-add sw1
-+
-+check ovn-nbctl lrp-add R1 rp-sw0 00:00:01:01:02:03 192.168.1.1/24
-+check ovn-nbctl lrp-add R1 rp-sw1 00:00:03:01:02:03 192.168.2.1/24
-+check ovn-nbctl set logical_router R1 options:chassis=hv1
-+
-+check ovn-nbctl lsp-add sw0 sw0-rp -- set Logical_Switch_Port sw0-rp \
-+ type=router options:router-port=rp-sw0 \
-+ -- lsp-set-addresses sw0-rp router
-+check ovn-nbctl lsp-add sw1 sw1-rp -- set Logical_Switch_Port sw1-rp \
-+ type=router options:router-port=rp-sw1 \
-+ -- lsp-set-addresses sw1-rp router
-+
-+ADD_NAMESPACES(sw01)
-+ADD_VETH(sw01, sw01, br-int, "192.168.1.2/24", "f0:00:00:01:02:03", \
-+ "192.168.1.1")
-+check ovn-nbctl lsp-add sw0 sw01 \
-+ -- lsp-set-addresses sw01 "f0:00:00:01:02:03 192.168.1.2"
-+
-+ADD_NAMESPACES(sw11)
-+ADD_VETH(sw11, sw11, br-int, "192.168.2.2/24", "f0:00:00:02:02:03", \
-+ "192.168.2.1")
-+check ovn-nbctl lsp-add sw1 sw11 \
-+ -- lsp-set-addresses sw11 "f0:00:00:02:02:03 192.168.2.2"
-+
-+NETNS_DAEMONIZE([sw01], [nc -k -l 8000], [nc-sw01.pid])
-+
-+test_ping() {
-+ NS_CHECK_EXEC([$1], [ping -q -c 1 $2 -w 2 | FORMAT_PING], \
-+[0], [dnl
-+1 packets transmitted, 1 received, 0% packet loss, time 0ms
-+])
-+}
-+
-+# Only SNAT
-+check ovn-nbctl --wait=hv lr-nat-add R1 snat 172.16.1.21 192.168.2.0/24
-+
-+echo "foo" > foo
-+NS_CHECK_EXEC([sw11], [nc 192.168.1.2 8000 < foo])
-+test_ping sw11 192.168.1.2
-+
-+# Ensure nat has been hit
-+OVS_WAIT_UNTIL([ovs-ofctl dump-flows br-int | grep -v "n_packets=0" | grep 'nat(src=172.16.1.21)'])
-+# Ensure conntrack entry is present
-+OVS_WAIT_FOR_OUTPUT([
-+ ovs-appctl dpctl/dump-conntrack | FORMAT_CT(192.168.2.2) | \
-+ sed -e 's/zone=[[0-9]]*/zone=nd_ns &&
++ (ip6.src == 0 || nd.sll == 0)
and applies the action
++ next;
++ arp
and
+ applies the action
+@@ -3018,8 +3024,7 @@ icmp6 {
+ ip && ip6.dst == B
+ with an action ct_snat;
. If the NAT rule is of type
+ dnat_and_snat and has stateless=true
in the
+- options, then the action would be ip4/6.dst=
+- (B)
.
++ options, then the action would be next;
.
+
+@@ -3059,7 +3064,7 @@ icmp6 {
+ action ct_snat_in_czone;
to unSNAT in the common
+ zone. If the NAT rule is of type dnat_and_snat and has
+ stateless=true
in the options, then the action
+- would be ip4/6.dst=(B)
.
++ would be next;
.
+
+@@ -4217,6 +4222,26 @@ icmp6 { + external ip and D is NAT external mac. + + ++
dnat_and_snat
NAT rule with
++ stateless=true
and allowed_ext_ips
++ configured, a priority-75 flow is programmed with match
++ ip4.dst == B
and action
++ outport = CR; next;
where B
++ is the NAT rule external IP and CR is the
++ chassisredirect
port representing the instance
++ of the logical router distributed gateway port on the
++ gateway chassis. Moreover a priority-70 flow is programmed
++ with same match and action drop;
.
++ For each dnat_and_snat
NAT rule with
++ stateless=true
and exempted_ext_ips
++ configured, a priority-75 flow is programmed with match
++ ip4.dst == B
and action
++ drop;
where B is the NAT rule
++ external IP.
++ A similar flow is added for IPv6 traffic.
++ ct_dnat_in_czone;
. If the NAT rule is of type
+ dnat_and_snat and has stateless=true
in the
+- options, then the action would be ip4/6.src=
+- (B)
.
++ options, then the action would be next;
.
+
+
+ +diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c +index e4e980720..ab28756af 100644 +--- a/northd/ovn-northd.c ++++ b/northd/ovn-northd.c +@@ -107,7 +107,10 @@ static const char *rbac_port_binding_auth[] = + static const char *rbac_port_binding_update[] = + {"chassis", "additional_chassis", + "encap", "additional_encap", +- "up", "virtual_parent"}; ++ "up", "virtual_parent", ++ /* NOTE: we only need to update the additional-chassis-activated key, ++ * but RBAC_Role doesn't support mutate operation for subkeys. */ ++ "options"}; + + static const char *rbac_mac_binding_auth[] = + {""}; +diff --git a/ovn-nb.xml b/ovn-nb.xml +index c197f431f..e700b2e88 100644 +--- a/ovn-nb.xml ++++ b/ovn-nb.xml +@@ -1045,6 +1045,17 @@ +
+ + ++ovn-controller
+ only if this same key and value is configured in the
+diff --git a/ovn-sb.xml b/ovn-sb.xml
+index 9f47a037e..49e851e2a 100644
+--- a/ovn-sb.xml
++++ b/ovn-sb.xml
+@@ -3374,6 +3374,21 @@ tcp.flags = RST;
+
+ ovn-controller
+ only if this same key and value is configured in the
+diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
+index a071b3689..76e5a5c2b 100644
+--- a/tests/ovn-northd.at
++++ b/tests/ovn-northd.at
+@@ -6734,6 +6734,7 @@ AT_CHECK([cat lrflows | grep -e lr_in_lookup_neighbor -e lr_in_learn_neighbor |
+ table=2 (lr_in_learn_neighbor), priority=90 , match=(nd_na), action=(put_nd(inport, nd.target, nd.tll); next;)
+ table=2 (lr_in_learn_neighbor), priority=90 , match=(nd_ns), action=(put_nd(inport, ip6.src, nd.sll); next;)
+ table=2 (lr_in_learn_neighbor), priority=95 , match=(nd_na && nd.tll == 0), action=(put_nd(inport, nd.target, eth.src); next;)
++ table=2 (lr_in_learn_neighbor), priority=95 , match=(nd_ns && (ip6.src == 0 || nd.sll == 0)), action=(next;)
+ ])
+
+ AT_CLEANUP
+diff --git a/tests/ovn.at b/tests/ovn.at
+index 3c079e0fb..1aa562de5 100644
+--- a/tests/ovn.at
++++ b/tests/ovn.at
+@@ -7432,7 +7432,7 @@ ovs-vsctl -- add-port br-int vif2 -- \
+ # Allow some time for ovn-northd and ovn-controller to catch up.
+ wait_for_ports_up
+ check ovn-nbctl --wait=hv sync
+-ovn-nbctl dump-flows > sbflows
++ovn-sbctl dump-flows > sbflows
+ AT_CAPTURE_FILE([sbflows])
+
+ for i in 1 2; do
+@@ -8037,7 +8037,7 @@ wait_for_ports_up
+ check ovn-nbctl --wait=hv sync
+ sleep 1
+
+-ovn-nbctl dump-flows > sbflows
++ovn-sbctl dump-flows > sbflows
+ AT_CAPTURE_FILE([sbflows])
+
+ for i in 1 2; do
+@@ -14015,6 +14015,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([options:multiple requested-chassis for logical port])
++AT_KEYWORDS([multi-chassis])
+ ovn_start
+
+ net_add n1
+@@ -14104,6 +14105,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([options:multiple requested-chassis for logical port: change chassis role])
++AT_KEYWORDS([multi-chassis])
+ ovn_start
+
+ net_add n1
+@@ -14153,6 +14155,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([options:multiple requested-chassis for logical port: unclaimed behavior])
++AT_KEYWORDS([multi-chassis])
+ ovn_start
+
+ net_add n1
+@@ -14233,6 +14236,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([basic connectivity with multiple requested-chassis])
++AT_KEYWORDS([multi-chassis])
+ ovn_start
+
+ net_add n1
+@@ -14567,6 +14571,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([localnet connectivity with multiple requested-chassis])
++AT_KEYWORDS([multi-chassis])
+ ovn_start
+
+ net_add n1
+@@ -14924,6 +14929,391 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
+ AT_CLEANUP
+ ])
+
++OVN_FOR_EACH_NORTHD([
++AT_SETUP([options:activation-strategy for logical port])
++AT_KEYWORDS([multi-chassis])
++ovn_start
++
++net_add n1
++
++sim_add hv1
++as hv1
++check ovs-vsctl add-br br-phys
++ovn_attach n1 br-phys 192.168.0.11
++
++sim_add hv2
++as hv2
++check ovs-vsctl add-br br-phys
++ovn_attach n1 br-phys 192.168.0.12
++
++sim_add hv3
++as hv3
++check ovs-vsctl add-br br-phys
++ovn_attach n1 br-phys 192.168.0.13
++
++# Disable local ARP responder to pass ARP requests through tunnels
++check ovn-nbctl ls-add ls0 -- add Logical_Switch ls0 other_config vlan-passthru=true
++
++check ovn-nbctl lsp-add ls0 migrator
++check ovn-nbctl lsp-set-options migrator requested-chassis=hv1,hv2 \
++ activation-strategy=rarp
++
++check ovn-nbctl lsp-add ls0 first
++check ovn-nbctl lsp-set-options first requested-chassis=hv1
++check ovn-nbctl lsp-add ls0 second
++check ovn-nbctl lsp-set-options second requested-chassis=hv2
++check ovn-nbctl lsp-add ls0 outside
++check ovn-nbctl lsp-set-options outside requested-chassis=hv3
++
++check ovn-nbctl lsp-set-addresses migrator "00:00:00:00:00:10 10.0.0.10"
++check ovn-nbctl lsp-set-addresses first "00:00:00:00:00:01 10.0.0.1"
++check ovn-nbctl lsp-set-addresses second "00:00:00:00:00:02 10.0.0.2"
++check ovn-nbctl lsp-set-addresses outside "00:00:00:00:00:03 10.0.0.3"
++
++for hv in hv1 hv2; do
++ as $hv check ovs-vsctl -- add-port br-int migrator -- \
++ set Interface migrator external-ids:iface-id=migrator \
++ options:tx_pcap=$hv/migrator-tx.pcap \
++ options:rxq_pcap=$hv/migrator-rx.pcap
++done
++
++as hv1 check ovs-vsctl -- add-port br-int first -- \
++ set Interface first external-ids:iface-id=first
++as hv2 check ovs-vsctl -- add-port br-int second -- \
++ set Interface second external-ids:iface-id=second
++as hv3 check ovs-vsctl -- add-port br-int outside -- \
++ set Interface outside external-ids:iface-id=outside
++
++for hv in hv1 hv2 hv3; do
++ wait_row_count Chassis 1 name=$hv
++done
++hv1_uuid=$(fetch_column Chassis _uuid name=hv1)
++hv2_uuid=$(fetch_column Chassis _uuid name=hv2)
++hv3_uuid=$(fetch_column Chassis _uuid name=hv3)
++
++wait_column "$hv1_uuid" Port_Binding chassis logical_port=migrator
++wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=migrator
++wait_column "$hv2_uuid" Port_Binding additional_chassis logical_port=migrator
++wait_column "$hv2_uuid" Port_Binding requested_additional_chassis logical_port=migrator
++
++wait_column "$hv1_uuid" Port_Binding chassis logical_port=first
++wait_column "$hv2_uuid" Port_Binding chassis logical_port=second
++wait_column "$hv3_uuid" Port_Binding chassis logical_port=outside
++
++OVN_POPULATE_ARP
++
++send_arp() {
++ local hv=$1 inport=$2 eth_src=$3 eth_dst=$4 spa=$5 tpa=$6
++ local request=${eth_dst}${eth_src}08060001080006040001${eth_src}${spa}${eth_dst}${tpa}
++ as ${hv} ovs-appctl netdev-dummy/receive $inport $request
++ echo "${request}"
++}
++
++send_rarp() {
++ local hv=$1 inport=$2 eth_src=$3 eth_dst=$4 spa=$5 tpa=$6
++ local request=${eth_dst}${eth_src}80350001080006040001${eth_src}${spa}${eth_dst}${tpa}
++ as ${hv} ovs-appctl netdev-dummy/receive $inport $request
++ echo "${request}"
++}
++
++reset_pcap_file() {
++ local hv=$1
++ local iface=$2
++ local pcap_file=$3
++ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
++ options:rxq_pcap=dummy-rx.pcap
++ check rm -f ${pcap_file}*.pcap
++ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
++ options:rxq_pcap=${pcap_file}-rx.pcap
++}
++
++reset_env() {
++ reset_pcap_file hv1 migrator hv1/migrator
++ reset_pcap_file hv2 migrator hv2/migrator
++ reset_pcap_file hv1 first hv1/first
++ reset_pcap_file hv2 second hv2/second
++ reset_pcap_file hv3 outside hv3/outside
++
++ for port in hv1/migrator hv2/migrator hv1/first hv2/second hv3/outside; do
++ : > $port.expected
++ done
++}
++
++check_packets() {
++ OVN_CHECK_PACKETS([hv1/migrator-tx.pcap], [hv1/migrator.expected])
++ OVN_CHECK_PACKETS([hv2/migrator-tx.pcap], [hv2/migrator.expected])
++ OVN_CHECK_PACKETS([hv3/outside-tx.pcap], [hv3/outside.expected])
++ OVN_CHECK_PACKETS([hv1/first-tx.pcap], [hv1/first.expected])
++ OVN_CHECK_PACKETS([hv2/second-tx.pcap], [hv2/second.expected])
++}
++
++migrator_spa=$(ip_to_hex 10 0 0 10)
++first_spa=$(ip_to_hex 10 0 0 1)
++second_spa=$(ip_to_hex 10 0 0 2)
++outside_spa=$(ip_to_hex 10 0 0 3)
++
++reset_env
++
++# Packet from hv3:Outside arrives to hv1:Migrator
++# hv3:Outside cannot reach hv2:Migrator because it is blocked by RARP strategy
++request=$(send_arp hv3 outside 000000000003 000000000010 $outside_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++
++# Packet from hv1:First arrives to hv1:Migrator
++# hv1:First cannot reach hv2:Migrator because it is blocked by RARP strategy
++request=$(send_arp hv1 first 000000000001 000000000010 $first_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++
++# Packet from hv2:Second arrives to hv1:Migrator
++# hv2:Second cannot reach hv2:Migrator because it is blocked by RARP strategy
++request=$(send_arp hv2 second 000000000002 000000000010 $second_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++
++check_packets
++reset_env
++
++# Packet from hv1:Migrator arrives to hv3:Outside
++request=$(send_arp hv1 migrator 000000000010 000000000003 $migrator_spa $outside_spa)
++echo $request >> hv3/outside.expected
++
++# Packet from hv1:Migrator arrives to hv1:First
++request=$(send_arp hv1 migrator 000000000010 000000000001 $migrator_spa $first_spa)
++echo $request >> hv1/first.expected
++
++# Packet from hv1:Migrator arrives to hv2:Second
++request=$(send_arp hv1 migrator 000000000010 000000000002 $migrator_spa $second_spa)
++echo $request >> hv2/second.expected
++
++check_packets
++reset_env
++
++# hv2:Migrator cannot reach to hv3:Outside because it is blocked by RARP strategy
++request=$(send_arp hv2 migrator 000000000010 000000000003 $migrator_spa $outside_spa)
++
++check_packets
++reset_env
++
++AT_CHECK([ovn-sbctl find port_binding logical_port=migrator | grep -q additional-chassis-activated], [1])
++
++# Now activate hv2:Migrator location
++request=$(send_rarp hv2 migrator 000000000010 ffffffffffff $migrator_spa $migrator_spa)
++
++# RARP was reinjected into the pipeline
++echo $request >> hv3/outside.expected
++echo $request >> hv1/first.expected
++echo $request >> hv2/second.expected
++
++check_packets
++reset_env
++
++pb_uuid=$(ovn-sbctl --bare --columns _uuid find Port_Binding logical_port=migrator)
++OVS_WAIT_UNTIL([test xhv2 = x$(ovn-sbctl get Port_Binding $pb_uuid options:additional-chassis-activated | tr -d '""')])
++
++# Now packet arrives to both locations
++request=$(send_arp hv3 outside 000000000003 000000000010 $outside_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++echo $request >> hv2/migrator.expected
++
++check_packets
++reset_env
++
++# Packet from hv1:Migrator still arrives to hv3:Outside
++request=$(send_arp hv1 migrator 000000000010 000000000003 $migrator_spa $outside_spa)
++echo $request >> hv3/outside.expected
++
++check_packets
++reset_env
++
++# hv2:Migrator can now reach to hv3:Outside because RARP strategy activated it
++request=$(send_arp hv2 migrator 000000000010 000000000003 $migrator_spa $outside_spa)
++echo $request >> hv3/outside.expected
++
++check_packets
++
++# complete port migration and check that -activated flag is reset
++check ovn-nbctl lsp-set-options migrator requested-chassis=hv2
++OVS_WAIT_UNTIL([test x = x$(ovn-sbctl get Port_Binding $pb_uuid options:additional-chassis-activated)])
++
++OVN_CLEANUP([hv1],[hv2],[hv3])
++
++AT_CLEANUP
++])
++
++OVN_FOR_EACH_NORTHD([
++AT_SETUP([options:activation-strategy=rarp is not waiting for southbound db])
++AT_KEYWORDS([multi-chassis])
++# unskip when ovn-controller is able to process incremental updates to flow
++# table without ovsdb transaction available
++AT_SKIP_IF([true])
++
++ovn_start
++
++net_add n1
++
++sim_add hv1
++as hv1
++check ovs-vsctl add-br br-phys
++ovn_attach n1 br-phys 192.168.0.11
++
++sim_add hv2
++as hv2
++check ovs-vsctl add-br br-phys
++ovn_attach n1 br-phys 192.168.0.12
++
++# Disable local ARP responder to pass ARP requests through tunnels
++check ovn-nbctl ls-add ls0 -- add Logical_Switch ls0 other_config vlan-passthru=true
++
++check ovn-nbctl lsp-add ls0 migrator
++check ovn-nbctl lsp-set-options migrator requested-chassis=hv1,hv2 \
++ activation-strategy=rarp
++
++check ovn-nbctl lsp-add ls0 first
++check ovn-nbctl lsp-set-options first requested-chassis=hv1
++
++check ovn-nbctl lsp-set-addresses migrator "00:00:00:00:00:10 10.0.0.10"
++check ovn-nbctl lsp-set-addresses first "00:00:00:00:00:01 10.0.0.1"
++
++for hv in hv1 hv2; do
++ as $hv check ovs-vsctl -- add-port br-int migrator -- \
++ set Interface migrator external-ids:iface-id=migrator \
++ options:tx_pcap=$hv/migrator-tx.pcap \
++ options:rxq_pcap=$hv/migrator-rx.pcap
++done
++
++as hv1 check ovs-vsctl -- add-port br-int first -- \
++ set Interface first external-ids:iface-id=first
++
++for hv in hv1 hv2; do
++ wait_row_count Chassis 1 name=$hv
++done
++hv1_uuid=$(fetch_column Chassis _uuid name=hv1)
++hv2_uuid=$(fetch_column Chassis _uuid name=hv2)
++
++wait_column "$hv1_uuid" Port_Binding chassis logical_port=migrator
++wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=migrator
++wait_column "$hv2_uuid" Port_Binding additional_chassis logical_port=migrator
++wait_column "$hv2_uuid" Port_Binding requested_additional_chassis logical_port=migrator
++
++wait_column "$hv1_uuid" Port_Binding chassis logical_port=first
++
++OVN_POPULATE_ARP
++
++send_arp() {
++ local hv=$1 inport=$2 eth_src=$3 eth_dst=$4 spa=$5 tpa=$6
++ local request=${eth_dst}${eth_src}08060001080006040001${eth_src}${spa}${eth_dst}${tpa}
++ as ${hv} ovs-appctl netdev-dummy/receive $inport $request
++ echo "${request}"
++}
++
++send_rarp() {
++ local hv=$1 inport=$2 eth_src=$3 eth_dst=$4 spa=$5 tpa=$6
++ local request=${eth_dst}${eth_src}80350001080006040001${eth_src}${spa}${eth_dst}${tpa}
++ as ${hv} ovs-appctl netdev-dummy/receive $inport $request
++ echo "${request}"
++}
++
++reset_pcap_file() {
++ local hv=$1
++ local iface=$2
++ local pcap_file=$3
++ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
++ options:rxq_pcap=dummy-rx.pcap
++ check rm -f ${pcap_file}*.pcap
++ as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
++ options:rxq_pcap=${pcap_file}-rx.pcap
++}
++
++reset_env() {
++ reset_pcap_file hv1 migrator hv1/migrator
++ reset_pcap_file hv2 migrator hv2/migrator
++ reset_pcap_file hv1 first hv1/first
++
++ for port in hv1/migrator hv2/migrator hv1/first; do
++ : > $port.expected
++ done
++}
++
++check_packets() {
++ OVN_CHECK_PACKETS([hv1/migrator-tx.pcap], [hv1/migrator.expected])
++ OVN_CHECK_PACKETS([hv2/migrator-tx.pcap], [hv2/migrator.expected])
++ OVN_CHECK_PACKETS([hv1/first-tx.pcap], [hv1/first.expected])
++}
++
++migrator_spa=$(ip_to_hex 10 0 0 10)
++first_spa=$(ip_to_hex 10 0 0 1)
++
++reset_env
++
++# Packet from hv1:First arrives to hv1:Migrator
++# hv1:First cannot reach hv2:Migrator because it is blocked by RARP strategy
++request=$(send_arp hv1 first 000000000001 000000000010 $first_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++
++check_packets
++reset_env
++
++# Packet from hv1:Migrator arrives to hv1:First
++request=$(send_arp hv1 migrator 000000000010 000000000001 $migrator_spa $first_spa)
++echo $request >> hv1/first.expected
++
++check_packets
++reset_env
++
++# hv2:Migrator cannot reach to hv1:First because it is blocked by RARP strategy
++request=$(send_arp hv2 migrator 000000000010 000000000001 $migrator_spa $first_spa)
++
++check_packets
++reset_env
++
++# Before proceeding, stop ovsdb-server to make sure we test in the environment
++# that can't remove flows triggered by updates to database
++as ovn-sb
++OVS_APP_EXIT_AND_WAIT([ovsdb-server])
++
++# Now activate hv2:Migrator location
++request=$(send_rarp hv2 migrator 000000000010 ffffffffffff $migrator_spa $migrator_spa)
++
++# RARP was reinjected into the pipeline
++echo $request >> hv1/first.expected
++
++# Now packet from hv1:First arrives to both locations
++request=$(send_arp hv1 first 000000000001 000000000010 $first_spa $migrator_spa)
++echo $request >> hv1/migrator.expected
++echo $request >> hv2/migrator.expected
++
++# Packet from hv1:Migrator still arrives to hv1:First
++request=$(send_arp hv1 migrator 000000000010 000000000001 $migrator_spa $first_spa)
++echo $request >> hv1/first.expected
++
++# hv2:Migrator can now reach to hv1:First because RARP strategy activated it
++request=$(send_arp hv2 migrator 000000000010 000000000001 $migrator_spa $first_spa)
++echo $request >> hv1/first.expected
++
++check_packets
++
++# restart ovsdb-server before cleaning up to give ovn-controller a chance to
++# exit gracefully
++mv $ovs_base/ovn-sb/ovsdb-server.log $ovs_base/ovn-sb/ovsdb-server.log.prev
++as ovn-sb start_daemon ovsdb-server \
++ -vjsonrpc \
++ --remote=punix:$ovs_base/ovn-sb/$1.sock \
++ --remote=db:OVN_Southbound,SB_Global,connections \
++ --private-key=$PKIDIR/testpki-test-privkey.pem \
++ --certificate=$PKIDIR/testpki-test-cert.pem \
++ --ca-cert=$PKIDIR/testpki-cacert.pem \
++ $ovs_base/ovn-sb/ovn-sb.db
++
++PARSE_LISTENING_PORT([$ovs_base/ovn-sb/ovsdb-server.log], [TCP_PORT])
++for i in 1 2; do
++ as hv$i
++ ovs-vsctl \
++ -- set Open_vSwitch . external-ids:ovn-remote=ssl:127.0.0.1:$TCP_PORT
++done
++OVN_CLEANUP([hv1],[hv2])
++
++AT_CLEANUP
++])
++
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([options:requested-chassis for logical port])
+ ovn_start
+diff --git a/tests/system-ovn.at b/tests/system-ovn.at
+index 4bf22593a..df2da3408 100644
+--- a/tests/system-ovn.at
++++ b/tests/system-ovn.at
+@@ -6741,6 +6741,21 @@ NS_CHECK_EXEC([vm1], [ping -q -c 3 -i 0.3 -w 2 172.18.2.10 | FORMAT_PING], \
+ [0], [dnl
+ 3 packets transmitted, 3 received, 0% packet loss, time 0ms
+ ])
++
++dnat_and_snat_uuid=$(fetch_column nb:NAT _uuid external_ip=172.18.2.10)
++ovn-nbctl set NAT $dnat_and_snat_uuid options:stateless=true
++
++# A ping from vm1 should hairpin in lr1 and successfully DNAT to vm2
++NS_CHECK_EXEC([vm1], [ping -q -c 3 -i 0.3 -w 2 172.18.2.10 | FORMAT_PING], \
++[0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++# A ping from vm2 should hairpin in lr1 and successfully DNAT to vm2
++NS_CHECK_EXEC([vm2], [ping -q -c 3 -i 0.3 -w 2 172.18.2.10 | FORMAT_PING], \
++[0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
+ kill $(pidof ovn-controller)
+
+ as ovn-sb
+diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl
+index d733aa42d..93be9b84b 100755
+--- a/utilities/ovn-ctl
++++ b/utilities/ovn-ctl
+@@ -42,8 +42,21 @@ ovn_ic_db_conf_file="$ovn_etcdir/ovn-ic-db-params.conf"
+
+ pidfile_is_running () {
+ pidfile=$1
+- test -e "$pidfile" && [ -s "$pidfile" ] && pid=`cat "$pidfile"` && pid_exists "$pid"
+-} >/dev/null 2>&1
++ cmd=$2
++ if [ ! -s "$pidfile" ]; then
++ # file missing or empty
++ return 1
++ fi
++ pid=`cat "$pidfile"`
++ if ! pid_exists $pid; then
++ # pid is dead
++ return 1
++ fi
++ if [ -n "$cmd" ]; then
++ return $(pid_comm_check "$cmd" "$pid")
++ fi
++ return 0
++}
+
+ stop_nb_ovsdb() {
+ OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovnnb_db $DB_NB_PIDFILE $DB_NB_CTRL_SOCK
+@@ -199,7 +212,7 @@ start_ovsdb__() {
+ ovn_install_dir "$ovn_etcdir"
+
+ # Check and eventually start ovsdb-server for DB
+- if pidfile_is_running $db_pid_file; then
++ if pidfile_is_running $db_pid_file ovsdb-server; then
+ return
+ fi
+
+@@ -298,6 +311,10 @@ $cluster_remote_port
+ set "$@" --sync-from=`cat $active_conf_file`
+ fi
+
++ if test X"$extra_args" != X; then
++ set "$@" $extra_args
++ fi
++
+ local run_ovsdb_in_bg="no"
+ local process_id=
+ if test X$detach = Xno && test $mode = cluster && test -z "$cluster_remote_addr" ; then
+@@ -528,6 +545,10 @@ start_ic () {
+
+ set "$@" $OVN_IC_LOG $ovn_ic_params
+
++ if test X"$extra_args" != X; then
++ set "$@" $extra_args
++ fi
++
+ OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_IC_PRIORITY" "$OVN_IC_WRAPPER" "$@"
+ fi
+ }
+@@ -550,6 +571,10 @@ start_controller () {
+
+ [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER"
+
++ if test X"$extra_args" != X; then
++ set "$@" $extra_args
++ fi
++
+ OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@"
+ }
+
+@@ -577,6 +602,10 @@ start_controller_vtep () {
+
+ [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER"
+
++ if test X"$extra_args" != X; then
++ set "$@" $extra_args
++ fi
++
+ OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@"
+ }
+
+@@ -1093,8 +1122,10 @@ EOF
+
+ set_defaults
+ command=
++extra_args=
+ for arg
+ do
++ shift
+ case $arg in
+ -h | --help)
+ usage
+@@ -1117,6 +1148,10 @@ do
+ type=bool
+ set_option
+ ;;
++ --)
++ extra_args=$@
++ break
++ ;;
+ -*)
+ echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
+ exit 1
+diff --git a/utilities/ovn-ctl.8.xml b/utilities/ovn-ctl.8.xml
+index a1d39b22b..42d16fabc 100644
+--- a/utilities/ovn-ctl.8.xml
++++ b/utilities/ovn-ctl.8.xml
+@@ -4,7 +4,10 @@
+ ovn-ctl -- Open Virtual Network northbound daemon lifecycle utility
+ +ovn-ctl
[options] command
++ ovn-ctl
[options] command
++ [--- extra_args]
++
This program is intended to be invoked internally by Open Virtual Network +@@ -156,6 +159,15 @@ +
--db-nb-probe-interval-to-active=Time in milliseconds
--db-sb-probe-interval-to-active=Time in milliseconds
++ Any options after '--' will be passed on to the binary run by
++ command with the exception of start_northd, which can have
++ options specified in ovn-northd-db-params.conf. Any extra_args
++ passed to start_northd will be passed to the ovsdb-servers if
++ --ovn-manage-ovsdb=yes
++
Following are the optional configuration files. If present, it should be located in the etc dir
+ +diff --git a/utilities/ovn-dbctl.c b/utilities/ovn-dbctl.c +index a292e589d..c4cc8c9b2 100644 +--- a/utilities/ovn-dbctl.c ++++ b/utilities/ovn-dbctl.c +@@ -202,6 +202,13 @@ ovn_dbctl_main(int argc, char *argv[], + error = ctl_parse_commands(argc - optind, argv_ + optind, + &local_options, &commands, &n_commands); + if (error) { ++ ovsdb_idl_destroy(idl); ++ idl = the_idl = NULL; ++ ++ for (int i = 0; i < argc; i++) { ++ free(argv_[i]); ++ } ++ free(argv_); + ctl_fatal("%s", error); + } + diff --git a/SPECS/ovn22.03.spec b/SPECS/ovn22.03.spec deleted file mode 100644 index 4da4fd4..0000000 --- a/SPECS/ovn22.03.spec +++ /dev/null @@ -1,625 +0,0 @@ -# Copyright (C) 2009, 2010, 2013, 2014 Nicira Networks, Inc. -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without warranty of any kind. -# -# If tests have to be skipped while building, specify the '--without check' -# option. For example: -# rpmbuild -bb --without check rhel/openvswitch-fedora.spec - -# This defines the base package name's version. - -%define pkgver 2.13 -%define pkgname ovn22.03 - -# If libcap-ng isn't available and there is no need for running OVS -# as regular user, specify the '--without libcapng' -%bcond_without libcapng - -# Enable PIE, bz#955181 -%global _hardened_build 1 - -# RHEL-7 doesn't define _rundir macro yet -# Fedora 15 onwards uses /run as _rundir -%if 0%{!?_rundir:1} -%define _rundir /run -%endif - -# Build python2 (that provides python) and python3 subpackages on Fedora -# Build only python3 (that provides python) subpackage on RHEL8 -# Build only python subpackage on RHEL7 -%if 0%{?rhel} > 7 || 0%{?fedora} -# On RHEL8 Sphinx is included in buildroot -%global external_sphinx 1 -%else -# Don't use external sphinx (RHV doesn't have optional repositories enabled) -%global external_sphinx 0 -%endif - -# We would see rpmlinit error - E: hardcoded-library-path in '% {_prefix}/lib'. -# But there is no solution to fix this. Using {_lib} macro will solve the -# rpmlink error, but will install the files in /usr/lib64/. -# OVN pacemaker ocf script file is copied in /usr/lib/ocf/resource.d/ovn/ -# and we are not sure if pacemaker looks into this path to find the -# OVN resource agent script. -%global ovnlibdir %{_prefix}/lib - -Name: %{pkgname} -Summary: Open Virtual Network support -Group: System Environment/Daemons -URL: http://www.ovn.org/ -Version: 22.03.0 -Release: 22%{?commit0:.%{date}git%{shortcommit0}}%{?dist} -Provides: openvswitch%{pkgver}-ovn-common = %{?epoch:%{epoch}:}%{version}-%{release} -Obsoletes: openvswitch%{pkgver}-ovn-common < 2.11.0-1 - -# Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the -# lib/sflow*.[ch] files are SISSL -License: ASL 2.0 and LGPLv2+ and SISSL - -# Always pull an upstream release, since this is what we rebase to. -Source: https://github.com/ovn-org/ovn/archive/v%{version}.tar.gz#/ovn-%{version}.tar.gz - -%define ovscommit ba159ee0f97ed770c244cd6710d34fe20595541d -%define ovsshortcommit ba159ee - -Source10: https://github.com/openvswitch/ovs/archive/%{ovscommit}.tar.gz#/openvswitch-%{ovsshortcommit}.tar.gz -%define ovsdir ovs-%{ovscommit} - -%define docutilsver 0.12 -%define pygmentsver 1.4 -%define sphinxver 1.1.3 -Source100: https://pypi.io/packages/source/d/docutils/docutils-%{docutilsver}.tar.gz -Source101: https://pypi.io/packages/source/P/Pygments/Pygments-%{pygmentsver}.tar.gz -Source102: https://pypi.io/packages/source/S/Sphinx/Sphinx-%{sphinxver}.tar.gz - -Source500: configlib.sh -Source501: gen_config_group.sh -Source502: set_config.sh - -# Important: source503 is used as the actual copy file -# @TODO: this causes a warning - fix it? -Source504: arm64-armv8a-linuxapp-gcc-config -Source505: ppc_64-power8-linuxapp-gcc-config -Source506: x86_64-native-linuxapp-gcc-config - -Patch: %{pkgname}.patch - -# FIXME Sphinx is used to generate some manpages, unfortunately, on RHEL, it's -# in the -optional repository and so we can't require it directly since RHV -# doesn't have the -optional repository enabled and so TPS fails -%if %{external_sphinx} -BuildRequires: python3-sphinx -%else -# Sphinx dependencies -BuildRequires: python-devel -BuildRequires: python-setuptools -#BuildRequires: python2-docutils -BuildRequires: python-jinja2 -BuildRequires: python-nose -#BuildRequires: python2-pygments -# docutils dependencies -BuildRequires: python-imaging -# pygments dependencies -BuildRequires: python-nose -%endif - -BuildRequires: gcc gcc-c++ make -BuildRequires: autoconf automake libtool -BuildRequires: systemd-units openssl openssl-devel -BuildRequires: python3-devel python3-setuptools -BuildRequires: desktop-file-utils -BuildRequires: groff-base graphviz -BuildRequires: unbound-devel - -# make check dependencies -BuildRequires: procps-ng -%if 0%{?rhel} == 8 || 0%{?fedora} -BuildRequires: python3-pyOpenSSL -%endif -BuildRequires: tcpdump - -%if %{with libcapng} -BuildRequires: libcap-ng libcap-ng-devel -%endif - -Requires: hostname openssl iproute module-init-tools - -Requires(post): systemd-units -Requires(preun): systemd-units -Requires(postun): systemd-units - -# to skip running checks, pass --without check -%bcond_without check - -%description -OVN, the Open Virtual Network, is a system to support virtual network -abstraction. OVN complements the existing capabilities of OVS to add -native support for virtual network abstractions, such as virtual L2 and L3 -overlays and security groups. - -%package central -Summary: Open Virtual Network support -License: ASL 2.0 -Requires: %{pkgname} -Requires: firewalld-filesystem -Provides: openvswitch%{pkgver}-ovn-central = %{?epoch:%{epoch}:}%{version}-%{release} -Obsoletes: openvswitch%{pkgver}-ovn-central < 2.11.0-1 - -%description central -OVN DB servers and ovn-northd running on a central node. - -%package host -Summary: Open Virtual Network support -License: ASL 2.0 -Requires: %{pkgname} -Requires: firewalld-filesystem -Provides: openvswitch%{pkgver}-ovn-host = %{?epoch:%{epoch}:}%{version}-%{release} -Obsoletes: openvswitch%{pkgver}-ovn-host < 2.11.0-1 - -%description host -OVN controller running on each host. - -%package vtep -Summary: Open Virtual Network support -License: ASL 2.0 -Requires: %{pkgname} -Provides: openvswitch%{pkgver}-ovn-vtep = %{?epoch:%{epoch}:}%{version}-%{release} -Obsoletes: openvswitch%{pkgver}-ovn-vtep < 2.11.0-1 - -%description vtep -OVN vtep controller - -%prep -%if 0%{?commit0:1} -%autosetup -n ovn-%{commit0} -a 10 -p 1 -%else -%autosetup -n ovn-%{version} -a 10 -p 1 -%endif - -%build -%if 0%{?commit0:1} -# fix the snapshot unreleased version to be the released one. -sed -i.old -e "s/^AC_INIT(openvswitch,.*,/AC_INIT(openvswitch, %{version},/" configure.ac -%endif -./boot.sh - -# OVN source code is now separate. -# Build openvswitch first. -# XXX Current openvswitch2.13 doesn't -# use "2.13.0" for version. It's a commit hash -pushd %{ovsdir} -./boot.sh -%configure \ -%if %{with libcapng} - --enable-libcapng \ -%else - --disable-libcapng \ -%endif - --enable-ssl \ - --with-pkidir=%{_sharedstatedir}/openvswitch/pki - -make %{?_smp_mflags} -popd - -# Build OVN. -# XXX OVS version needs to be updated when ovs2.13 is updated. -%configure \ - --with-ovs-source=$PWD/%{ovsdir} \ -%if %{with libcapng} - --enable-libcapng \ -%else - --disable-libcapng \ -%endif - --enable-ssl \ - --with-pkidir=%{_sharedstatedir}/openvswitch/pki - -make %{?_smp_mflags} - -%install -%make_install -install -p -D -m 0644 \ - rhel/usr_share_ovn_scripts_systemd_sysconfig.template \ - $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/ovn - -for service in ovn-controller ovn-controller-vtep ovn-northd; do - install -p -D -m 0644 \ - rhel/usr_lib_systemd_system_${service}.service \ - $RPM_BUILD_ROOT%{_unitdir}/${service}.service -done - -install -d -m 0755 $RPM_BUILD_ROOT/%{_sharedstatedir}/ovn - -install -d $RPM_BUILD_ROOT%{ovnlibdir}/firewalld/services/ -install -p -m 0644 rhel/usr_lib_firewalld_services_ovn-central-firewall-service.xml \ - $RPM_BUILD_ROOT%{ovnlibdir}/firewalld/services/ovn-central-firewall-service.xml -install -p -m 0644 rhel/usr_lib_firewalld_services_ovn-host-firewall-service.xml \ - $RPM_BUILD_ROOT%{ovnlibdir}/firewalld/services/ovn-host-firewall-service.xml - -install -d -m 0755 $RPM_BUILD_ROOT%{ovnlibdir}/ocf/resource.d/ovn -ln -s %{_datadir}/ovn/scripts/ovndb-servers.ocf \ - $RPM_BUILD_ROOT%{ovnlibdir}/ocf/resource.d/ovn/ovndb-servers - -install -p -D -m 0644 rhel/etc_logrotate.d_ovn \ - $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/ovn - -# remove unneeded files. -rm -f $RPM_BUILD_ROOT%{_bindir}/ovs* -rm -f $RPM_BUILD_ROOT%{_bindir}/vtep-ctl -rm -f $RPM_BUILD_ROOT%{_sbindir}/ovs* -rm -f $RPM_BUILD_ROOT%{_mandir}/man1/ovs* -rm -f $RPM_BUILD_ROOT%{_mandir}/man5/ovs* -rm -f $RPM_BUILD_ROOT%{_mandir}/man5/vtep* -rm -f $RPM_BUILD_ROOT%{_mandir}/man7/ovs* -rm -f $RPM_BUILD_ROOT%{_mandir}/man8/ovs* -rm -f $RPM_BUILD_ROOT%{_mandir}/man8/vtep* -rm -rf $RPM_BUILD_ROOT%{_datadir}/ovn/python -rm -f $RPM_BUILD_ROOT%{_datadir}/ovn/scripts/ovs* -rm -rf $RPM_BUILD_ROOT%{_datadir}/ovn/bugtool-plugins -rm -f $RPM_BUILD_ROOT%{_libdir}/*.a -rm -f $RPM_BUILD_ROOT%{_libdir}/*.la -rm -f $RPM_BUILD_ROOT%{_libdir}/pkgconfig/*.pc -rm -f $RPM_BUILD_ROOT%{_includedir}/ovn/* -rm -f $RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d/ovs-appctl-bashcomp.bash -rm -f $RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d/ovs-vsctl-bashcomp.bash -rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/openvswitch -rm -f $RPM_BUILD_ROOT%{_datadir}/ovn/scripts/ovn-bugtool* -rm -f $RPM_BUILD_ROOT/%{_bindir}/ovn-docker-overlay-driver \ - $RPM_BUILD_ROOT/%{_bindir}/ovn-docker-underlay-driver - -%check -%if %{with check} - touch resolv.conf - export OVS_RESOLV_CONF=$(pwd)/resolv.conf - if ! make check TESTSUITEFLAGS='%{_smp_mflags}'; then - cat tests/testsuite.log - if ! make check TESTSUITEFLAGS='--recheck'; then - cat tests/testsuite.log - # Presently a test case - "2796: ovn -- ovn-controller incremental processing" - # is failing on aarch64 arch. Let's not exit for this arch - # until we figure out why it is failing. - # Test case 93: ovn.at:12105 ovn -- ACLs on Port Groups is failing - # repeatedly on s390x. This needs to be investigated. - %ifnarch aarch64 - %ifnarch ppc64le - %ifnarch s390x - exit 1 - %endif - %endif - %endif - fi - fi -%endif - -%clean -rm -rf $RPM_BUILD_ROOT - -%pre central -if [ $1 -eq 1 ] ; then - # Package install. - /bin/systemctl status ovn-northd.service >/dev/null - ovn_status=$? - rpm -ql openvswitch-ovn-central > /dev/null - if [[ "$?" = "0" && "$ovn_status" = "0" ]]; then - # ovn-northd service is running which means old openvswitch-ovn-central - # is already installed and it will be cleaned up. So start ovn-northd - # service when posttrans central is called. - touch %{_localstatedir}/lib/rpm-state/ovn-northd - fi -fi - -%pre host -if [ $1 -eq 1 ] ; then - # Package install. - /bin/systemctl status ovn-controller.service >/dev/null - ovn_status=$? - rpm -ql openvswitch-ovn-host > /dev/null - if [[ "$?" = "0" && "$ovn_status" = "0" ]]; then - # ovn-controller service is running which means old - # openvswitch-ovn-host is installed and it will be cleaned up. So - # start ovn-controller service when posttrans host is called. - touch %{_localstatedir}/lib/rpm-state/ovn-controller - fi -fi - -%pre vtep -if [ $1 -eq 1 ] ; then - # Package install. - /bin/systemctl status ovn-controller-vtep.service >/dev/null - ovn_status=$? - rpm -ql openvswitch-ovn-vtep > /dev/null - if [[ "$?" = "0" && "$ovn_status" = "0" ]]; then - # ovn-controller-vtep service is running which means old - # openvswitch-ovn-vtep is installed and it will be cleaned up. So - # start ovn-controller-vtep service when posttrans host is called. - touch %{_localstatedir}/lib/rpm-state/ovn-controller-vtep - fi -fi - -%preun central -%if 0%{?systemd_preun:1} - %systemd_preun ovn-northd.service -%else - if [ $1 -eq 0 ] ; then - # Package removal, not upgrade - /bin/systemctl --no-reload disable ovn-northd.service >/dev/null 2>&1 || : - /bin/systemctl stop ovn-northd.service >/dev/null 2>&1 || : - fi -%endif - -%preun host -%if 0%{?systemd_preun:1} - %systemd_preun ovn-controller.service -%else - if [ $1 -eq 0 ] ; then - # Package removal, not upgrade - /bin/systemctl --no-reload disable ovn-controller.service >/dev/null 2>&1 || : - /bin/systemctl stop ovn-controller.service >/dev/null 2>&1 || : - fi -%endif - -%preun vtep -%if 0%{?systemd_preun:1} - %systemd_preun ovn-controller-vtep.service -%else - if [ $1 -eq 0 ] ; then - # Package removal, not upgrade - /bin/systemctl --no-reload disable ovn-controller-vtep.service >/dev/null 2>&1 || : - /bin/systemctl stop ovn-controller-vtep.service >/dev/null 2>&1 || : - fi -%endif - -%post -%if %{with libcapng} -if [ $1 -eq 1 ]; then - sed -i 's:^#OVN_USER_ID=:OVN_USER_ID=:' %{_sysconfdir}/sysconfig/ovn - sed -i 's:\(.*su\).*:\1 openvswitch openvswitch:' %{_sysconfdir}/logrotate.d/ovn -fi -%endif - -%post central -%if 0%{?systemd_post:1} - %systemd_post ovn-northd.service -%else - # Package install, not upgrade - if [ $1 -eq 1 ]; then - /bin/systemctl daemon-reload >dev/null || : - fi -%endif - -%post host -%if 0%{?systemd_post:1} - %systemd_post ovn-controller.service -%else - # Package install, not upgrade - if [ $1 -eq 1 ]; then - /bin/systemctl daemon-reload >dev/null || : - fi -%endif - -%post vtep -%if 0%{?systemd_post:1} - %systemd_post ovn-controller-vtep.service -%else - # Package install, not upgrade - if [ $1 -eq 1 ]; then - /bin/systemctl daemon-reload >dev/null || : - fi -%endif - -%postun - -%postun central -%if 0%{?systemd_postun_with_restart:1} - %systemd_postun_with_restart ovn-northd.service -%else - /bin/systemctl daemon-reload >/dev/null 2>&1 || : - if [ "$1" -ge "1" ] ; then - # Package upgrade, not uninstall - /bin/systemctl try-restart ovn-northd.service >/dev/null 2>&1 || : - fi -%endif - -%postun host -%if 0%{?systemd_postun_with_restart:1} - %systemd_postun_with_restart ovn-controller.service -%else - /bin/systemctl daemon-reload >/dev/null 2>&1 || : - if [ "$1" -ge "1" ] ; then - # Package upgrade, not uninstall - /bin/systemctl try-restart ovn-controller.service >/dev/null 2>&1 || : - fi -%endif - -%postun vtep -%if 0%{?systemd_postun_with_restart:1} - %systemd_postun_with_restart ovn-controller-vtep.service -%else - /bin/systemctl daemon-reload >/dev/null 2>&1 || : - if [ "$1" -ge "1" ] ; then - # Package upgrade, not uninstall - /bin/systemctl try-restart ovn-controller-vtep.service >/dev/null 2>&1 || : - fi -%endif - -%posttrans central -if [ $1 -eq 1 ]; then - # Package install, not upgrade - if [ -e %{_localstatedir}/lib/rpm-state/ovn-northd ]; then - rm %{_localstatedir}/lib/rpm-state/ovn-northd - /bin/systemctl start ovn-northd.service >/dev/null 2>&1 || : - fi -fi - - -%posttrans host -if [ $1 -eq 1 ]; then - # Package install, not upgrade - if [ -e %{_localstatedir}/lib/rpm-state/ovn-controller ]; then - rm %{_localstatedir}/lib/rpm-state/ovn-controller - /bin/systemctl start ovn-controller.service >/dev/null 2>&1 || : - fi -fi - -%posttrans vtep -if [ $1 -eq 1 ]; then - # Package install, not upgrade - if [ -e %{_localstatedir}/lib/rpm-state/ovn-controller-vtep ]; then - rm %{_localstatedir}/lib/rpm-state/ovn-controller-vtep - /bin/systemctl start ovn-controller-vtep.service >/dev/null 2>&1 || : - fi -fi - -%files -%{_bindir}/ovn-nbctl -%{_bindir}/ovn-sbctl -%{_bindir}/ovn-trace -%{_bindir}/ovn-detrace -%{_bindir}/ovn_detrace.py -%{_bindir}/ovn-appctl -%{_bindir}/ovn-ic-nbctl -%{_bindir}/ovn-ic-sbctl -%dir %{_datadir}/ovn/ -%dir %{_datadir}/ovn/scripts/ -%{_datadir}/ovn/scripts/ovn-ctl -%{_datadir}/ovn/scripts/ovn-lib -%{_datadir}/ovn/scripts/ovndb-servers.ocf -%{_mandir}/man8/ovn-ctl.8* -%{_mandir}/man8/ovn-appctl.8* -%{_mandir}/man8/ovn-nbctl.8* -%{_mandir}/man8/ovn-ic-nbctl.8* -%{_mandir}/man8/ovn-trace.8* -%{_mandir}/man1/ovn-detrace.1* -%{_mandir}/man7/ovn-architecture.7* -%{_mandir}/man8/ovn-sbctl.8* -%{_mandir}/man8/ovn-ic-sbctl.8* -%{_mandir}/man5/ovn-nb.5* -%{_mandir}/man5/ovn-ic-nb.5* -%{_mandir}/man5/ovn-sb.5* -%{_mandir}/man5/ovn-ic-sb.5* -%dir %{ovnlibdir}/ocf/resource.d/ovn/ -%{ovnlibdir}/ocf/resource.d/ovn/ovndb-servers -%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/logrotate.d/ovn -%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/ovn - -%files central -%{_bindir}/ovn-northd -%{_bindir}/ovn-ic -%{_mandir}/man8/ovn-northd.8* -%{_mandir}/man8/ovn-ic.8* -%{_datadir}/ovn/ovn-nb.ovsschema -%{_datadir}/ovn/ovn-ic-nb.ovsschema -%{_datadir}/ovn/ovn-sb.ovsschema -%{_datadir}/ovn/ovn-ic-sb.ovsschema -%{_unitdir}/ovn-northd.service -%{ovnlibdir}/firewalld/services/ovn-central-firewall-service.xml - -%files host -%{_bindir}/ovn-controller -%{_mandir}/man8/ovn-controller.8* -%{_unitdir}/ovn-controller.service -%{ovnlibdir}/firewalld/services/ovn-host-firewall-service.xml - -%files vtep -%{_bindir}/ovn-controller-vtep -%{_mandir}/man8/ovn-controller-vtep.8* -%{_unitdir}/ovn-controller-vtep.service - -%changelog -* Tue Apr 26 2022 Adrian Moreno