diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index f7c6c71..3de5e28 100644
--- a/SOURCES/openvswitch-2.17.0.patch
+++ b/SOURCES/openvswitch-2.17.0.patch
@@ -1,5 +1,5 @@
 diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
-index 6cd38ff3ef..2dabd3d0a4 100755
+index 6cd38ff3ef..392c7ee79c 100755
 --- a/.ci/linux-build.sh
 +++ b/.ci/linux-build.sh
 @@ -220,7 +220,7 @@ fi
@@ -7,7 +7,7 @@ index 6cd38ff3ef..2dabd3d0a4 100755
  if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
      if [ -z "$DPDK_VER" ]; then
 -        DPDK_VER="21.11"
-+        DPDK_VER="21.11.1"
++        DPDK_VER="21.11.2"
      fi
      install_dpdk $DPDK_VER
  fi
@@ -60,7 +60,7 @@ index eac3504e48..6c9dddbb59 100644
  
      strategy:
 diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst
-index af524251ff..33a0d5d2d4 100644
+index af524251ff..49895c595f 100644
 --- a/Documentation/faq/releases.rst
 +++ b/Documentation/faq/releases.rst
 @@ -32,7 +32,7 @@ Q: What does it mean for an Open vSwitch release to be LTS (long-term support)?
@@ -72,21 +72,25 @@ index af524251ff..33a0d5d2d4 100644
  
      For more information on the Open vSwitch release process, refer to
      :doc:`/internals/release-process`.
-@@ -208,9 +208,9 @@ Q: What DPDK version does each Open vSwitch release work with?
+@@ -206,11 +206,11 @@ Q: What DPDK version does each Open vSwitch release work with?
+     2.10.x       17.11.10
+     2.11.x       18.11.9
      2.12.x       18.11.9
-     2.13.x       19.11.10
-     2.14.x       19.11.10
+-    2.13.x       19.11.10
+-    2.14.x       19.11.10
 -    2.15.x       20.11.1
 -    2.16.x       20.11.1
 -    2.17.x       21.11.0
-+    2.15.x       20.11.4
-+    2.16.x       20.11.4
-+    2.17.x       21.11.1
++    2.13.x       19.11.13
++    2.14.x       19.11.13
++    2.15.x       20.11.6
++    2.16.x       20.11.6
++    2.17.x       21.11.2
      ============ ========
  
  Q: Are all the DPDK releases that OVS versions work with maintained?
 diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
-index d9f44055db..f8f01bfadd 100644
+index d9f44055db..a284e68514 100644
 --- a/Documentation/intro/install/dpdk.rst
 +++ b/Documentation/intro/install/dpdk.rst
 @@ -42,7 +42,7 @@ Build requirements
@@ -94,7 +98,7 @@ index d9f44055db..f8f01bfadd 100644
  vSwitch with DPDK will require the following:
  
 -- DPDK 21.11
-+- DPDK 21.11.1
++- DPDK 21.11.2
  
  - A `DPDK supported NIC`_
  
@@ -105,9 +109,9 @@ index d9f44055db..f8f01bfadd 100644
 -       $ wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz
 -       $ tar xf dpdk-21.11.tar.xz
 -       $ export DPDK_DIR=/usr/src/dpdk-21.11
-+       $ wget https://fast.dpdk.org/rel/dpdk-21.11.1.tar.xz
-+       $ tar xf dpdk-21.11.1.tar.xz
-+       $ export DPDK_DIR=/usr/src/dpdk-stable-21.11
++       $ wget https://fast.dpdk.org/rel/dpdk-21.11.2.tar.xz
++       $ tar xf dpdk-21.11.2.tar.xz
++       $ export DPDK_DIR=/usr/src/dpdk-stable-21.11.2
         $ cd $DPDK_DIR
  
  #. Configure and install DPDK using Meson
@@ -125,10 +129,10 @@ index c4300cd53e..a297aadac8 100644
  
  - GNU make.
 diff --git a/NEWS b/NEWS
-index c10e9bfacc..7c71284f97 100644
+index c10e9bfacc..36fcbb8748 100644
 --- a/NEWS
 +++ b/NEWS
-@@ -1,3 +1,33 @@
+@@ -1,3 +1,51 @@
 +v2.17.3 - xx xxx xxxx
 +---------------------
 +   - OVSDB:
@@ -136,6 +140,24 @@ index c10e9bfacc..7c71284f97 100644
 +       configuration in a clustered databse independently for each server.
 +       E.g. for listening on unique addresses.  See the ovsdb.local-config.5
 +       manpage for schema details.
++   - DPDK:
++     * OVS validated with DPDK 21.11.2.
++       DPDK 21.11.2 contains fixes for the following CVEs:
++       CVE-2022-28199 cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-28199
++       CVE-2022-2132 cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-2132
++       A bug was introduced in DPDK 21.11.1 by the commit
++       01e3dee29c02 ("vhost: fix unsafe vring addresses modifications").
++       This bug can cause a deadlock when vIOMMU is enabled and NUMA
++       reallocation of the virtqueues happen.
++       A fix has been posted and pushed to the DPDK 21.11 branch.
++       It can be found here:
++       https://patches.dpdk.org/project/dpdk/patch/20220725203206.427083-2-david.marchand@redhat.com/.
++       If a user wishes to avoid the issue then it is recommended to use
++       DPDK 21.11.0 until the release of DPDK 21.11.3.
++       It should be noted that DPDK 21.11.0 does not benefit from the numerous
++       bug and CVE fixes addressed since its release.
++       If a user wishes to benefit from these fixes it is recommended to use
++       DPDK 21.11.2.
 +
 +v2.17.2 - 15 Jun 2022
 +---------------------
@@ -50780,6 +50802,19 @@ index 33a1a92953..0103fb5396 100644
                                      conn_key_hash(parent_key, ct->hash_basis),
                                      &ct->alg_expectation_refs) {
          if (!conn_key_cmp(&node->parent_key, parent_key)) {
+diff --git a/lib/daemon-unix.c b/lib/daemon-unix.c
+index 34d45b82a1..31db2d2c7c 100644
+--- a/lib/daemon-unix.c
++++ b/lib/daemon-unix.c
+@@ -393,6 +393,8 @@ monitor_daemon(pid_t daemon_pid)
+                 }
+ 
+                 log_received_backtrace(daemonize_fd);
++                close(daemonize_fd);
++                daemonize_fd = -1;
+ 
+                 /* Throttle restarts to no more than once every 10 seconds. */
+                 if (time(NULL) < last_restart + 10) {
 diff --git a/lib/dns-resolve.c b/lib/dns-resolve.c
 index d344514343..1afcc65adb 100644
 --- a/lib/dns-resolve.c
@@ -54289,7 +54324,7 @@ index 47115a7b85..ba5d179a65 100644
  /* Transactions with named-uuid row names. */
  struct json *ovsdb_datum_to_json_with_row_names(const struct ovsdb_datum *,
 diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
-index c19128d55c..882ede7559 100644
+index c19128d55c..917868c54a 100644
 --- a/lib/ovsdb-idl.c
 +++ b/lib/ovsdb-idl.c
 @@ -389,25 +389,25 @@ ovsdb_idl_clear(struct ovsdb_idl *db)
@@ -54414,7 +54449,18 @@ index c19128d55c..882ede7559 100644
                  if (!ovsdb_idl_track_is_set(row->table)) {
                      ovs_list_remove(&row->track_node);
                      ovsdb_idl_row_unparse(row);
-@@ -2729,7 +2729,7 @@ ovsdb_idl_txn_increment(struct ovsdb_idl_txn *txn,
+@@ -2367,6 +2367,10 @@ ovsdb_idl_insert_row(struct ovsdb_idl_row *row, const struct shash *data)
+ static void
+ ovsdb_idl_delete_row(struct ovsdb_idl_row *row)
+ {
++    /* If row has to be reparsed, reparse it before it's deleted. */
++    if (!ovs_list_is_empty(&row->reparse_node)) {
++        ovsdb_idl_row_parse(row);
++    }
+     ovsdb_idl_remove_from_indexes(row);
+     ovsdb_idl_row_clear_arcs(row, true);
+     ovsdb_idl_row_destroy(row);
+@@ -2729,7 +2733,7 @@ ovsdb_idl_txn_increment(struct ovsdb_idl_txn *txn,
  void
  ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
  {
@@ -54423,7 +54469,7 @@ index c19128d55c..882ede7559 100644
  
      if (txn->status == TXN_INCOMPLETE) {
          ovsdb_cs_forget_transaction(txn->idl->cs, txn->request_id);
-@@ -2739,7 +2739,7 @@ ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
+@@ -2739,7 +2743,7 @@ ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
      ovsdb_idl_txn_abort(txn);
      ds_destroy(&txn->comment);
      free(txn->error);
@@ -54432,7 +54478,7 @@ index c19128d55c..882ede7559 100644
          free(insert);
      }
      hmap_destroy(&txn->inserted_rows);
-@@ -2824,7 +2824,7 @@ substitute_uuids(struct json *json, const struct ovsdb_idl_txn *txn)
+@@ -2824,7 +2828,7 @@ substitute_uuids(struct json *json, const struct ovsdb_idl_txn *txn)
  static void
  ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn)
  {
@@ -54441,7 +54487,7 @@ index c19128d55c..882ede7559 100644
  
      /* This must happen early.  Otherwise, ovsdb_idl_row_parse() will call an
       * ovsdb_idl_column's 'parse' function, which will call
-@@ -2832,7 +2832,7 @@ ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn)
+@@ -2832,7 +2836,7 @@ ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn)
       * transaction and fail to update the graph.  */
      txn->idl->txn = NULL;
  
@@ -55931,7 +55977,7 @@ index bd60adcbc8..2442ceca74 100644
      [ax_cv_func_posix_memalign_works=no],
      [ax_cv_func_posix_memalign_works=no])])
 diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4
-index 4c3bace6ef..21808483e9 100644
+index 4c3bace6ef..09134feca0 100644
 --- a/m4/openvswitch.m4
 +++ b/m4/openvswitch.m4
 @@ -21,7 +21,7 @@ AC_DEFUN([OVS_CHECK_COVERAGE],
@@ -56015,11 +56061,49 @@ index 4c3bace6ef..21808483e9 100644
                      [directory used for conf.db [[SYSCONFDIR/PACKAGE]]]),
       [DBDIR=$withval],
       [DBDIR='${sysconfdir}/${PACKAGE}'])
+@@ -436,8 +436,8 @@ AC_DEFUN([OVS_CHECK_BINUTILS_AVX512],
+      mkdir -p build-aux
+      OBJFILE=build-aux/binutils_avx512_check.o
+      GATHER_PARAMS='0x8(,%ymm1,1),%ymm0{%k2}'
+-     echo "vpgatherqq $GATHER_PARAMS" | as --64 -o $OBJFILE -
+      if ($CC -dumpmachine | grep x86_64) >/dev/null 2>&1; then
++       echo "vpgatherqq $GATHER_PARAMS" | as --64 -o $OBJFILE -
+        if (objdump -d  --no-show-raw-insn $OBJFILE | grep -q $GATHER_PARAMS) >/dev/null 2>&1; then
+          ovs_cv_binutils_avx512_good=yes
+        else
+@@ -446,11 +446,11 @@ AC_DEFUN([OVS_CHECK_BINUTILS_AVX512],
+          dnl and causing zmm usage with buggy binutils versions.
+          CFLAGS="$CFLAGS -mno-avx512f"
+        fi
++       rm $OBJFILE
+      else
+        dnl non x86_64 architectures don't have avx512, so not affected
+        ovs_cv_binutils_avx512_good=no
+      fi])
+-     rm $OBJFILE
+    if test "$ovs_cv_binutils_avx512_good" = yes; then
+      AC_DEFINE([HAVE_LD_AVX512_GOOD], [1],
+                [Define to 1 if binutils correctly supports AVX512.])
 diff --git a/ofproto/bond.c b/ofproto/bond.c
-index cdfdf0b9d8..845f69e21d 100644
+index cdfdf0b9d8..6ecd6e1c9f 100644
 --- a/ofproto/bond.c
 +++ b/ofproto/bond.c
-@@ -338,7 +338,7 @@ static void
+@@ -185,10 +185,14 @@ static struct bond_member *choose_output_member(const struct bond *,
+                                                 uint16_t vlan)
+     OVS_REQ_RDLOCK(rwlock);
+ static void update_recirc_rules__(struct bond *);
++static bool bond_may_recirc(const struct bond *);
++static void bond_update_post_recirc_rules__(struct bond *, bool force)
++    OVS_REQ_WRLOCK(rwlock);
+ static bool bond_is_falling_back_to_ab(const struct bond *);
+ static void bond_add_lb_output_buckets(const struct bond *);
+ static void bond_del_lb_output_buckets(const struct bond *);
+ 
++
+ /* Attempts to parse 's' as the name of a bond balancing mode.  If successful,
+  * stores the mode in '*balance' and returns true.  Otherwise returns false
+  * without modifying '*balance'. */
+@@ -338,7 +342,7 @@ static void
  update_recirc_rules__(struct bond *bond)
  {
      struct match match;
@@ -56028,7 +56112,7 @@ index cdfdf0b9d8..845f69e21d 100644
      uint64_t ofpacts_stub[128 / 8];
      struct ofpbuf ofpacts;
      int i;
-@@ -372,7 +372,7 @@ update_recirc_rules__(struct bond *bond)
+@@ -372,7 +376,7 @@ update_recirc_rules__(struct bond *bond)
  
      ofpbuf_use_stub(&ofpacts, ofpacts_stub, sizeof ofpacts_stub);
  
@@ -56037,7 +56121,62 @@ index cdfdf0b9d8..845f69e21d 100644
          int error;
          switch (pr_op->op) {
          case ADD:
-@@ -1258,7 +1258,7 @@ insert_bal(struct ovs_list *bals, struct bond_member *member)
+@@ -510,6 +514,12 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s)
+         bond_entry_reset(bond);
+     }
+ 
++    if (bond->ofproto->backer->rt_support.odp.recirc
++        && bond_may_recirc(bond)) {
++        /* Update rules to reflect possible recirc_id changes. */
++        update_recirc_rules(bond);
++    }
++
+     ovs_rwlock_unlock(&rwlock);
+     return revalidate;
+ }
+@@ -723,6 +733,12 @@ bond_run(struct bond *bond, enum lacp_status lacp_status)
+         bond_choose_active_member(bond);
+     }
+ 
++    if (bond->ofproto->backer->rt_support.odp.recirc
++        && bond_may_recirc(bond)) {
++        /* Update rules to reflect possible link state changes. */
++        bond_update_post_recirc_rules__(bond, false);
++    }
++
+     revalidate = bond->bond_revalidate;
+     bond->bond_revalidate = false;
+     ovs_rwlock_unlock(&rwlock);
+@@ -1038,7 +1054,7 @@ bond_may_recirc(const struct bond *bond)
+ }
+ 
+ static void
+-bond_update_post_recirc_rules__(struct bond* bond, const bool force)
++bond_update_post_recirc_rules__(struct bond* bond, bool force)
+     OVS_REQ_WRLOCK(rwlock)
+ {
+    struct bond_entry *e;
+@@ -1086,6 +1102,19 @@ bond_update_post_recirc_rules(struct bond *bond, uint32_t *recirc_id,
+     }
+ }
+ 
++void
++bond_get_recirc_id_and_hash_basis(struct bond *bond, uint32_t *recirc_id,
++                                  uint32_t *hash_basis)
++{
++    ovs_rwlock_rdlock(&rwlock);
++    if (bond_may_recirc(bond)) {
++        *recirc_id = bond->recirc_id;
++        *hash_basis = bond->basis;
++    } else {
++        *recirc_id = *hash_basis = 0;
++    }
++    ovs_rwlock_unlock(&rwlock);
++}
+ 
+ /* Rebalancing. */
+ 
+@@ -1258,7 +1287,7 @@ insert_bal(struct ovs_list *bals, struct bond_member *member)
              break;
          }
      }
@@ -56046,6 +56185,20 @@ index cdfdf0b9d8..845f69e21d 100644
  }
  
  /* Removes 'member' from its current list and then inserts it into 'bals' so
+diff --git a/ofproto/bond.h b/ofproto/bond.h
+index 1683ec8781..e7f7ea7a95 100644
+--- a/ofproto/bond.h
++++ b/ofproto/bond.h
+@@ -128,6 +128,9 @@ void bond_rebalance(struct bond *);
+ void bond_update_post_recirc_rules(struct bond *, uint32_t *recirc_id,
+                                    uint32_t *hash_basis);
+ 
++void bond_get_recirc_id_and_hash_basis(struct bond *, uint32_t *recirc_id,
++                                       uint32_t *hash_basis);
++
+ bool bond_use_lb_output_action(const struct bond *bond);
+ 
+ #endif /* bond.h */
 diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
 index fa8f6cd0e8..172a58cfb7 100644
 --- a/ofproto/connmgr.c
@@ -56444,6 +56597,64 @@ index 78a54c715d..109940ad2a 100644
              ovs_list_remove(&node->node);
              oftrace_node_destroy(node);
          }
+diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
+index 57f94df544..fe47090584 100644
+--- a/ofproto/ofproto-dpif-upcall.c
++++ b/ofproto/ofproto-dpif-upcall.c
+@@ -362,6 +362,10 @@ static void upcall_unixctl_dump_wait(struct unixctl_conn *conn, int argc,
+                                      const char *argv[], void *aux);
+ static void upcall_unixctl_purge(struct unixctl_conn *conn, int argc,
+                                  const char *argv[], void *aux);
++static void upcall_unixctl_pause(struct unixctl_conn *conn, int argc,
++                                 const char *argv[], void *aux);
++static void upcall_unixctl_resume(struct unixctl_conn *conn, int argc,
++                                  const char *argv[], void *aux);
+ 
+ static struct udpif_key *ukey_create_from_upcall(struct upcall *,
+                                                  struct flow_wildcards *);
+@@ -434,6 +438,10 @@ udpif_init(void)
+                                  upcall_unixctl_dump_wait, NULL);
+         unixctl_command_register("revalidator/purge", "", 0, 0,
+                                  upcall_unixctl_purge, NULL);
++        unixctl_command_register("revalidator/pause", NULL, 0, 0,
++                                 upcall_unixctl_pause, NULL);
++        unixctl_command_register("revalidator/resume", NULL, 0, 0,
++                                 upcall_unixctl_resume, NULL);
+         ovsthread_once_done(&once);
+     }
+ }
+@@ -3099,6 +3107,31 @@ upcall_unixctl_purge(struct unixctl_conn *conn, int argc OVS_UNUSED,
+     unixctl_command_reply(conn, "");
+ }
+ 
++static void
++upcall_unixctl_pause(struct unixctl_conn *conn, int argc OVS_UNUSED,
++                     const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
++{
++    struct udpif *udpif;
++
++    LIST_FOR_EACH (udpif, list_node, &all_udpifs) {
++        udpif_pause_revalidators(udpif);
++    }
++    unixctl_command_reply(conn, "");
++}
++
++static void
++upcall_unixctl_resume(struct unixctl_conn *conn, int argc OVS_UNUSED,
++                      const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
++{
++    struct udpif *udpif;
++
++    LIST_FOR_EACH (udpif, list_node, &all_udpifs) {
++        udpif_resume_revalidators(udpif);
++    }
++    unixctl_command_reply(conn, "");
++}
++
++
+ /* Flows are sorted in the following order:
+  * netdev, flow state (offloaded/kernel path), flow_pps_rate.
+  */
 diff --git a/ofproto/ofproto-dpif-xlate-cache.c b/ofproto/ofproto-dpif-xlate-cache.c
 index dcc91cb380..9224ee2e6d 100644
 --- a/ofproto/ofproto-dpif-xlate-cache.c
@@ -56481,7 +56692,7 @@ index 114aff8ea3..0fc6d2ea60 100644
      enum xc_type type;
      union {
 diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
-index 578cbfe581..a13cf7bc65 100644
+index 578cbfe581..e804c4d887 100644
 --- a/ofproto/ofproto-dpif-xlate.c
 +++ b/ofproto/ofproto-dpif-xlate.c
 @@ -865,7 +865,7 @@ xlate_xbridge_init(struct xlate_cfg *xcfg, struct xbridge *xbridge)
@@ -56603,7 +56814,29 @@ index 578cbfe581..a13cf7bc65 100644
  
  
          /* If this mirror selects on the basis of VLAN, and it does not select
-@@ -3015,7 +3037,7 @@ xlate_normal(struct xlate_ctx *ctx)
+@@ -2444,9 +2466,18 @@ output_normal(struct xlate_ctx *ctx, const struct xbundle *out_xbundle,
+             /* In case recirculation is not actually in use, 'xr.recirc_id'
+              * will be set to '0', since a valid 'recirc_id' can
+              * not be zero.  */
+-            bond_update_post_recirc_rules(out_xbundle->bond,
+-                                          &xr.recirc_id,
+-                                          &xr.hash_basis);
++            if (ctx->xin->allow_side_effects) {
++                bond_update_post_recirc_rules(out_xbundle->bond,
++                                              &xr.recirc_id,
++                                              &xr.hash_basis);
++            } else {
++                /* If side effects are not allowed, only getting the bond
++                 * configuration.  Rule updates will be handled by the
++                 * main thread later. */
++                bond_get_recirc_id_and_hash_basis(out_xbundle->bond,
++                                                  &xr.recirc_id,
++                                                  &xr.hash_basis);
++            }
+             if (xr.recirc_id) {
+                 /* Use recirculation instead of output. */
+                 use_recirc = true;
+@@ -3015,7 +3046,7 @@ xlate_normal(struct xlate_ctx *ctx)
      bool is_grat_arp = is_gratuitous_arp(flow, wc);
      if (ctx->xin->allow_side_effects
          && flow->packet_type == htonl(PT_ETH)
@@ -56612,7 +56845,7 @@ index 578cbfe581..a13cf7bc65 100644
      ) {
          update_learning_table(ctx, in_xbundle, flow->dl_src, vlan,
                                is_grat_arp);
-@@ -3024,12 +3046,14 @@ xlate_normal(struct xlate_ctx *ctx)
+@@ -3024,12 +3055,14 @@ xlate_normal(struct xlate_ctx *ctx)
          struct xc_entry *entry;
  
          /* Save just enough info to update mac learning table later. */
@@ -56633,7 +56866,7 @@ index 578cbfe581..a13cf7bc65 100644
      }
  
      /* Determine output bundle. */
-@@ -3048,7 +3072,6 @@ xlate_normal(struct xlate_ctx *ctx)
+@@ -3048,7 +3081,6 @@ xlate_normal(struct xlate_ctx *ctx)
               */
              ctx->xout->slow |= SLOW_ACTION;
  
@@ -56641,7 +56874,7 @@ index 578cbfe581..a13cf7bc65 100644
              if (mcast_snooping_is_membership(flow->tp_src) ||
                  mcast_snooping_is_query(flow->tp_src)) {
                  if (ctx->xin->allow_side_effects && ctx->xin->packet) {
-@@ -3523,6 +3546,9 @@ propagate_tunnel_data_to_flow__(struct flow *dst_flow,
+@@ -3523,6 +3555,9 @@ propagate_tunnel_data_to_flow__(struct flow *dst_flow,
      dst_flow->dl_dst = dmac;
      dst_flow->dl_src = smac;
  
@@ -56651,7 +56884,7 @@ index 578cbfe581..a13cf7bc65 100644
      dst_flow->packet_type = htonl(PT_ETH);
      dst_flow->nw_dst = src_flow->tunnel.ip_dst;
      dst_flow->nw_src = src_flow->tunnel.ip_src;
-@@ -3654,14 +3680,27 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
+@@ -3654,14 +3689,27 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
  
      err = tnl_neigh_lookup(out_dev->xbridge->name, &d_ip6, &dmac);
      if (err) {
@@ -56681,7 +56914,7 @@ index 578cbfe581..a13cf7bc65 100644
          }
          return err;
      }
-@@ -4176,6 +4215,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
+@@ -4176,6 +4224,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
          if (xport->pt_mode == NETDEV_PT_LEGACY_L3) {
              flow->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE,
                                                 ntohs(flow->dl_type));
@@ -56692,7 +56925,7 @@ index 578cbfe581..a13cf7bc65 100644
          }
      }
  
-@@ -5622,7 +5665,8 @@ xlate_sample_action(struct xlate_ctx *ctx,
+@@ -5622,7 +5674,8 @@ xlate_sample_action(struct xlate_ctx *ctx,
  
      /* Scale the probability from 16-bit to 32-bit while representing
       * the same percentage. */
@@ -56702,7 +56935,7 @@ index 578cbfe581..a13cf7bc65 100644
  
      /* If ofp_port in flow sample action is equel to ofp_port,
       * this sample action is a input port action. */
-@@ -7609,6 +7653,10 @@ xlate_wc_finish(struct xlate_ctx *ctx)
+@@ -7609,6 +7662,10 @@ xlate_wc_finish(struct xlate_ctx *ctx)
              ctx->wc->masks.vlans[i].tci = 0;
          }
      }
@@ -56713,7 +56946,7 @@ index 578cbfe581..a13cf7bc65 100644
  }
  
  /* Translates the flow, actions, or rule in 'xin' into datapath actions in
-@@ -7784,6 +7832,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
+@@ -7784,6 +7841,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
          goto exit;
      }
  
@@ -58862,7 +59095,7 @@ index ef7bb4b8ee..c36a140a8e 100644
 -#endif
  }
 diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
-index 4ecdcaa197..8f13d1f55a 100644
+index 4ecdcaa197..8e31e02d79 100644
 --- a/python/ovs/db/idl.py
 +++ b/python/ovs/db/idl.py
 @@ -140,6 +140,47 @@ class ConditionState(object):
@@ -59043,10 +59276,14 @@ index 4ecdcaa197..8f13d1f55a 100644
  def _row_to_uuid(value):
      if isinstance(value, Row):
          return value.uuid
-@@ -1268,6 +1297,17 @@ class Row(object):
+@@ -1266,7 +1295,19 @@ class Row(object):
+         return "{table}({data})".format(
+             table=self._table.name,
              data=", ".join("{col}={val}".format(col=c, val=getattr(self, c))
-                            for c in sorted(self._table.columns)))
- 
+-                           for c in sorted(self._table.columns)))
++                           for c in sorted(self._table.columns)
++                           if hasattr(self, c)))
++
 +    def _uuid_to_row(self, atom, base):
 +        if base.ref_table:
 +            try:
@@ -59057,11 +59294,10 @@ index 4ecdcaa197..8f13d1f55a 100644
 +            return table.rows.get(atom)
 +        else:
 +            return atom
-+
+ 
      def __getattr__(self, column_name):
          assert self._changes is not None
-         assert self._mutations is not None
-@@ -1309,7 +1349,7 @@ class Row(object):
+@@ -1309,7 +1350,7 @@ class Row(object):
                      datum = data.Datum.from_python(column.type, dlist,
                                                     _row_to_uuid)
                  elif column.type.is_map():
@@ -59070,7 +59306,7 @@ index 4ecdcaa197..8f13d1f55a 100644
                      if inserts is not None:
                          dmap.update(inserts)
                      if removes is not None:
-@@ -1326,7 +1366,7 @@ class Row(object):
+@@ -1326,7 +1367,7 @@ class Row(object):
                  else:
                      datum = inserts
  
@@ -59079,7 +59315,7 @@ index 4ecdcaa197..8f13d1f55a 100644
  
      def __setattr__(self, column_name, value):
          assert self._changes is not None
-@@ -1410,7 +1450,7 @@ class Row(object):
+@@ -1410,7 +1451,7 @@ class Row(object):
          if value:
              try:
                  old_value = data.Datum.to_python(self._data[column_name],
@@ -60239,7 +60475,7 @@ index 2c7e163bd6..7be6628c34 100644
  AT_CLEANUP
  
 diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
-index 7c2edeb9d4..aee2af9fad 100644
+index 7c2edeb9d4..1a8de7398c 100644
 --- a/tests/ofproto-dpif.at
 +++ b/tests/ofproto-dpif.at
 @@ -29,6 +29,39 @@ AT_CHECK([ovs-appctl revalidator/wait])
@@ -60431,7 +60667,80 @@ index 7c2edeb9d4..aee2af9fad 100644
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -570,7 +603,7 @@ table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
+@@ -498,6 +531,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore])
+ OVS_VSWITCHD_STOP()
+ AT_CLEANUP
+ 
++dnl Regression test for a deadlock / double lock on post-recirculation rule
++dnl updates while processing PACKET_OUT.
++AT_SETUP([ofproto-dpif - balance-tcp bonding rule updates on packet-out])
++dnl Create br0 with interfaces bond0(p1, p2) and p5,
++dnl    and br1 with interfaces bond1(p3, p4) and p6.
++dnl    bond0 <-> bond1
++OVS_VSWITCHD_START(
++  [add-bond br0 bond0 p1 p2 bond_mode=balance-tcp lacp=active dnl
++        other-config:lacp-time=fast other-config:bond-rebalance-interval=1000 -- dnl
++   set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p1.sock ofport_request=1 mtu_request=65535 -- dnl
++   set interface p2 type=dummy options:pstream=punix:$OVS_RUNDIR/p2.sock ofport_request=2 mtu_request=65535 -- dnl
++   add-port br0 p5 -- set interface p5 ofport_request=5 type=dummy mtu_request=65535 -- dnl
++   add-br br1 -- dnl
++   set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- dnl
++   set bridge br1 datapath-type=dummy other-config:datapath-id=1234 dnl
++                  fail-mode=secure -- dnl
++   add-bond br1 bond1 p3 p4 bond_mode=balance-tcp lacp=active dnl
++        other-config:lacp-time=fast other-config:bond-rebalance-interval=1000 -- dnl
++   set interface p3 type=dummy options:stream=unix:$OVS_RUNDIR/p1.sock ofport_request=3 mtu_request=65535 -- dnl
++   set interface p4 type=dummy options:stream=unix:$OVS_RUNDIR/p2.sock ofport_request=4 mtu_request=65535 -- dnl
++   add-port br1 p6 -- set interface p6 ofport_request=6 type=dummy mtu_request=65535 --])
++AT_CHECK([ovs-appctl vlog/set bond:dbg])
++AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
++])
++AT_CHECK([ovs-ofctl add-flow br0 action=normal])
++AT_CHECK([ovs-ofctl add-flow br1 action=normal])
++OVS_WAIT_WHILE([ovs-appctl bond/show | grep "may_enable: false"])
++
++ovs-appctl time/stop
++ovs-appctl time/warp 2000 200
++
++dnl Send some traffic to distribute all the hashes between ports.
++AT_CHECK([SEND_TCP_BOND_PKTS([p5], [5], [65500])])
++
++dnl Wait for rebalancing for per-hash stats accounting.
++ovs-appctl time/warp 1000 100
++
++dnl Check that p2 handles some hashes.
++ovs-appctl bond/show > bond1.txt
++AT_CHECK([sed -n '/member p2/,/^$/p' bond1.txt | grep 'hash'], [0], [ignore])
++
++dnl Pause revalidators to be sure that they do not update flows while
++dnl the bonding configuration chnages.
++ovs-appctl revalidator/pause
++
++dnl Move p2 down to trigger update of bonding post-recirculation rules by
++dnl forcing move of all the hashes to p1.
++AT_CHECK([ovs-appctl netdev-dummy/set-admin-state p2 down], 0, [OK
++])
++
++dnl Send PACKET_OUT that may lead to flow updates since the bonding
++dnl configuration changed.
++packet=ffffffffffff00102030405008004500001c00000000401100000a000002ffffffff0035111100080000
++AT_CHECK([ovs-ofctl packet-out br0 "in_port=p5 packet=$packet actions=resubmit(,0)"])
++
++dnl Resume revalidators.
++ovs-appctl revalidator/resume
++ovs-appctl revalidator/wait
++
++ovs-appctl time/warp 200 100
++dnl Check that all hashes moved form p2 and OVS is still working.
++ovs-appctl bond/show > bond2.txt
++AT_CHECK([sed -n '/member p2/,/^$/p' bond2.txt | grep 'hash'], [1], [ignore])
++
++OVS_VSWITCHD_STOP()
++AT_CLEANUP
+ 
+ # Makes sure recirculation does not change the way packet is handled.
+ AT_SETUP([ofproto-dpif - balance-tcp bonding, different recirc flow ])
+@@ -570,7 +669,7 @@ table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
  table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
  ])
  AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
@@ -60440,7 +60749,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
  ])
-@@ -584,7 +617,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
+@@ -584,7 +683,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
  for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
  echo "table=64 actions=output(11)" >> flows.txt
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
@@ -60449,7 +60758,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10,11
  ])
-@@ -600,7 +633,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2)
+@@ -600,7 +699,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2)
  table=2 ip actions=set_field:192.168.3.91->ip_src,output(11)
  ])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
@@ -60458,7 +60767,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -2 stdout], [0],
    [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
  Datapath actions: 10,set(ipv4(src=192.168.3.91)),11,set(ipv4(src=192.168.3.90)),13
-@@ -617,7 +650,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
+@@ -617,7 +716,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
  table=2 in_port=1,icmp6,icmpv6_type=135 actions=set_field:fe80::4->nd_target,set_field:cc:cc:cc:cc:cc:cc->nd_sll,output(11)
  ])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
@@ -60467,7 +60776,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -4 stdout], [0],
    [Megaflow: recirc_id=0,eth,icmp6,in_port=1,nw_frag=no,icmp_type=0x87/0xff,icmp_code=0x0/0xff,nd_target=fe80::2020,nd_sll=66:55:44:33:22:11
  Datapath actions: 10,set(nd(target=fe80::4,sll=cc:cc:cc:cc:cc:cc)),11,set(nd(target=fe80::3,sll=aa:aa:aa:aa:aa:aa)),13
-@@ -635,7 +668,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip
+@@ -635,7 +734,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip
  table=1 tcp actions=set_field:91->tp_src,output(11),clear_actions
  ])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
@@ -60476,7 +60785,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -2 stdout], [0],
    [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_frag=no,tp_src=8
  Datapath actions: 10,set(tcp(src=91)),11
-@@ -649,7 +682,7 @@ add_of_ports br0 1 10 11
+@@ -649,7 +748,7 @@ add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=set_field:192.168.3.90->ip_src,group:123,bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=123,type=all,bucket=output:10'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
@@ -60485,7 +60794,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),11
  ])
-@@ -661,7 +694,7 @@ OVS_VSWITCHD_START
+@@ -661,7 +760,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
@@ -60494,7 +60803,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  # Must match on the source address to be able to restore it's value for
  # the second bucket
  AT_CHECK([tail -2 stdout], [0],
-@@ -676,7 +709,7 @@ OVS_VSWITCHD_START
+@@ -676,7 +775,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
@@ -60503,7 +60812,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -708,7 +741,7 @@ OVS_VSWITCHD_START
+@@ -708,7 +807,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
@@ -60512,7 +60821,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  # Must match on the source address to be able to restore it's value for
  # the third bucket
  AT_CHECK([tail -2 stdout], [0],
-@@ -723,7 +756,7 @@ OVS_VSWITCHD_START
+@@ -723,7 +822,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
@@ -60521,7 +60830,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -743,11 +776,11 @@ add_of_ports br0 1
+@@ -743,11 +842,11 @@ add_of_ports br0 1
  add_of_ports br1 2
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br1 'ip actions=write_actions(pop_vlan,output:2)'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=output:10'])
@@ -60535,7 +60844,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: pop_vlan,2
  ])
-@@ -1011,7 +1044,7 @@ OVS_VSWITCHD_START
+@@ -1011,7 +1110,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
@@ -60544,7 +60853,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -1142,7 +1175,7 @@ OVS_VSWITCHD_START
+@@ -1142,7 +1241,7 @@ OVS_VSWITCHD_START
  add_of_ports br0 1 10 11
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,move:NXM_NX_REG1[[]]->NXM_OF_IP_SRC[[]],bucket=output:11'])
  AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(load:0xffffffff->NXM_NX_REG1[[]],move:NXM_NX_REG1[[]]->NXM_NX_REG2[[]],group:1234)'])
@@ -60553,7 +60862,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([tail -2 stdout], [0],
    [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no
  Datapath actions: set(ipv4(src=255.255.255.255)),10,set(ipv4(src=192.168.0.1)),11
-@@ -1288,7 +1321,7 @@ table=1 in_port=1 action=dec_ttl,output:3
+@@ -1288,7 +1387,7 @@ table=1 in_port=1 action=dec_ttl,output:3
  AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
  AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
  AT_CHECK([tail -4 stdout], [0], [
@@ -60562,7 +60871,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  Megaflow: recirc_id=0,eth,ip,in_port=1,nw_ttl=2,nw_frag=no
  Datapath actions: set(ipv4(ttl=1)),2,userspace(pid=0,controller(reason=2,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535)),4
  ])
-@@ -1311,7 +1344,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:
+@@ -1311,7 +1410,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=34 in_port=1 (via invalid_ttl) data_len=34 (unbuffered)
@@ -60571,7 +60880,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1497,13 +1530,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
+@@ -1497,13 +1596,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered)
@@ -60588,7 +60897,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -1560,13 +1593,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
+@@ -1560,13 +1659,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered)
@@ -60605,7 +60914,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1627,13 +1660,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1627,13 +1726,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=118 in_port=1 (via action) data_len=118 (unbuffered)
@@ -60622,7 +60931,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Hit table 0, Miss all other tables, sent to controller
-@@ -1647,13 +1680,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1647,13 +1746,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=253 cookie=0x0 total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered)
@@ -60639,7 +60948,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1690,13 +1723,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1690,13 +1789,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x0 total_len=118 in_port=1 (via action) data_len=118 (unbuffered)
@@ -60656,7 +60965,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Hit table 1, Miss all other tables, sent to controller
-@@ -1710,13 +1743,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1710,13 +1809,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=253 cookie=0x0 total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered)
@@ -60673,7 +60982,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1900,13 +1933,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1900,13 +1999,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered)
@@ -60690,7 +60999,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Singleton controller action.
-@@ -1920,11 +1953,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1920,11 +2019,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via action) data_len=54 (unbuffered)
@@ -60705,7 +61014,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Modified controller action.
-@@ -1938,13 +1971,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1938,13 +2037,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60722,7 +61031,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Modified VLAN controller action.
-@@ -1958,13 +1991,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1958,13 +2057,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=38 in_port=1 (via action) data_len=38 (unbuffered)
@@ -60739,7 +61048,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Checksum TCP.
-@@ -1978,31 +2011,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1978,31 +2077,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=54 in_port=1 (via action) data_len=54 (unbuffered)
@@ -60780,7 +61089,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Checksum UDP.
-@@ -2016,31 +2049,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -2016,31 +2115,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
@@ -60821,7 +61130,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Modified ARP controller action.
-@@ -2087,31 +2120,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
+@@ -2087,31 +2186,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered)
@@ -60862,7 +61171,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
-@@ -2151,13 +2184,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2151,13 +2250,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=118 in_port=1 (via action) data_len=118 (unbuffered)
@@ -60879,7 +61188,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -2325,13 +2358,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2325,13 +2424,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=34 in_port=1 (via action) data_len=34 (unbuffered)
@@ -60896,7 +61205,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl Modified MPLS controller action.
-@@ -2539,13 +2572,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2539,13 +2638,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60913,7 +61222,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2565,13 +2598,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2565,13 +2664,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60930,7 +61239,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2591,13 +2624,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2591,13 +2690,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60947,7 +61256,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2617,13 +2650,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2617,13 +2716,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60964,7 +61273,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2643,13 +2676,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2643,13 +2742,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60981,7 +61290,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2669,13 +2702,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2669,13 +2768,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -60998,7 +61307,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2695,13 +2728,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2695,13 +2794,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61015,7 +61324,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2721,13 +2754,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2721,13 +2820,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61032,7 +61341,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2771,13 +2804,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2771,13 +2870,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61049,7 +61358,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2797,13 +2830,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2797,13 +2896,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61066,7 +61375,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2823,13 +2856,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2823,13 +2922,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61083,7 +61392,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2931,13 +2964,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2931,13 +3030,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61100,7 +61409,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2959,13 +2992,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2959,13 +3058,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xe total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61117,7 +61426,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2986,13 +3019,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2986,13 +3085,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0xe total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61134,7 +61443,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3314,13 +3347,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3314,13 +3413,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.2) (xid=0x0): table_id=1 total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61151,7 +61460,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3363,13 +3396,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3363,13 +3462,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.2) (xid=0x0): total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
@@ -61168,7 +61477,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3402,13 +3435,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -3402,13 +3501,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via action) data_len=54 (unbuffered)
@@ -61185,7 +61494,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3444,13 +3477,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3444,13 +3543,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.3) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered)
@@ -61202,7 +61511,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3516,13 +3549,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2):
+@@ -3516,13 +3615,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2):
    REQUESTFORWARD: (off)
  dnl
  OFPT_PACKET_IN (OF1.3) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered)
@@ -61219,7 +61528,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3558,13 +3591,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -3558,13 +3657,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  AT_CHECK([ovs-appctl revalidator/purge], [0])
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.4) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered)
@@ -61236,7 +61545,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3607,34 +3640,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3607,34 +3706,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.3) (xid=0x0): table_id=1 cookie=0x0 total_len=54 in_port=1 (via action) data_len=54 (unbuffered)
@@ -61281,7 +61590,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3679,34 +3712,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3679,34 +3778,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.4) (xid=0x0): table_id=1 cookie=0x0 total_len=54 in_port=1 (via action) data_len=54 (unbuffered)
@@ -61326,7 +61635,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3751,10 +3784,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3751,10 +3850,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  OFPT_PACKET_IN (OF1.3) (xid=0x0): table_id=43 cookie=0x0 total_len=98 metadata=0x67871d4d000000,in_port=1 (via action) data_len=98 (unbuffered)
@@ -61339,7 +61648,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -5007,7 +5040,7 @@ ovs-vsctl \
+@@ -5007,7 +5106,7 @@ ovs-vsctl \
  AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
  
  # "in_port" defaults to OFPP_NONE if it's not specified.
@@ -61348,7 +61657,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
  AT_CHECK_UNQUOTED([tail -1 stdout], [0],
    [Datapath actions: 1,2
-@@ -5317,7 +5350,7 @@ ovs-vsctl \
+@@ -5317,7 +5416,7 @@ ovs-vsctl \
  AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
  
  # "in_port" defaults to OFPP_NONE if it's not specified.
@@ -61357,7 +61666,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
  AT_CHECK_UNQUOTED([tail -1 stdout], [0],
    [Datapath actions: 1,trunc(100),2
-@@ -5464,7 +5497,7 @@ ovs-vsctl \
+@@ -5464,7 +5563,7 @@ ovs-vsctl \
  
  flow="in_port=1"
  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
@@ -61366,7 +61675,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -5512,11 +5545,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
+@@ -5512,11 +5611,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
  
  flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
  AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
@@ -61380,7 +61689,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -5573,7 +5606,36 @@ check_flows () {
+@@ -5573,7 +5672,36 @@ check_flows () {
      echo "n_packets=$n"
      test "$n" = 1
  }
@@ -61418,7 +61727,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -6202,6 +6264,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl
+@@ -6202,6 +6330,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl
  ovs-appctl: ovs-vswitchd: server returned an error
  ])
  
@@ -61439,7 +61748,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -7031,7 +7107,7 @@ dnl An 170 byte packet
+@@ -7031,7 +7173,7 @@ dnl An 170 byte packet
  AT_CHECK([ovs-appctl netdev-dummy/receive p1 '000c29c8a0a4005056c0000808004500009cb4a6000040019003c0a8da01c0a8da640800cb5fa762000556f431ad0009388e08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f'])
  
  AT_CHECK([ovs-ofctl parse-pcap p1.pcap], [0], [dnl
@@ -61448,7 +61757,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -7600,13 +7676,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the
+@@ -7600,13 +7742,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the
  dnl datapath level.
  AT_SETUP([ofproto-dpif - Bridge IPFIX sanity check])
  OVS_VSWITCHD_START
@@ -61478,7 +61787,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  dnl Send some packets that should be sampled.
  for i in `seq 1 3`; do
      AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800)'])
-@@ -8666,7 +8757,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1
+@@ -8666,7 +8823,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1
  ])
  
  AT_CHECK([grep -e '|ofproto_dpif_xlate|WARN|' ovs-vswitchd.log | sed "s/^.*|WARN|//"], [0], [dnl
@@ -61487,7 +61796,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP(["/stack underflow/d"])
-@@ -9855,7 +9946,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -9855,7 +10012,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 in_port=1 (via no_match) data_len=86 (unbuffered)
@@ -61496,7 +61805,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -9906,7 +9997,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -9906,7 +10063,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 in_port=1 (via action) data_len=86 (unbuffered)
@@ -61505,7 +61814,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10166,10 +10257,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10166,10 +10323,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. We only see the latter two packets, not the first.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x0 total_len=106 reg0=0x1,reg1=0x4d2,reg2=0x1,reg3=0x1,reg4=0x1,in_port=1 (via action) data_len=106 (unbuffered)
@@ -61518,7 +61827,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
-@@ -10187,10 +10278,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10187,10 +10344,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. We should see both packets
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x0 total_len=106 reg0=0x1,reg1=0x4d2,reg2=0x1,reg3=0x1,reg4=0x1,in_port=1 (via action) data_len=106 (unbuffered)
@@ -61531,7 +61840,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10239,10 +10330,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10239,10 +10396,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
  dnl happens because the ct_state field is available only after recirc.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61544,7 +61853,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
-@@ -10261,10 +10352,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10261,10 +10418,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
  dnl happens because the ct_state field is available only after recirc.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61557,7 +61866,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl
-@@ -10320,9 +10411,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10320,9 +10477,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
  dnl happens because the ct_state field is available only after recirc.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=126 in_port=1 (via action) data_len=126 (unbuffered)
@@ -61569,7 +61878,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10433,7 +10524,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10433,7 +10590,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. Only one reply must be there
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ip,in_port=2 (via action) data_len=106 (unbuffered)
@@ -61578,7 +61887,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  dnl
  OFPT_ECHO_REQUEST (xid=0x0): 0 bytes of payload
  ])
-@@ -10467,7 +10558,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10467,7 +10624,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 ct_state=inv|trk,ipv6,in_port=2 (via action) data_len=86 (unbuffered)
@@ -61587,7 +61896,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10523,16 +10614,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10523,16 +10680,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. We only see the latter two packets (for each zone), not the first.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61608,7 +61917,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10579,10 +10670,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10579,10 +10736,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. We only see the latter two packets, not the first.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61621,7 +61930,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10629,10 +10720,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10629,10 +10786,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output. We only see the first and the last packet
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=47 ct_state=new|trk,ct_nw_src=172.16.0.1,ct_nw_dst=172.16.0.2,ct_nw_proto=17,ct_tp_src=41614,ct_tp_dst=5555,ip,in_port=1 (via action) data_len=47 (unbuffered)
@@ -61634,7 +61943,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10681,19 +10772,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10681,19 +10838,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61659,7 +61968,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10738,10 +10829,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10738,10 +10895,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_label=0x1,ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ip,in_port=2 (via action) data_len=106 (unbuffered)
@@ -61672,7 +61981,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -11152,16 +11243,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -11152,16 +11309,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
  dnl happens because the ct_state field is available only after recirc.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
@@ -61693,7 +62002,7 @@ index 7c2edeb9d4..aee2af9fad 100644
  ])
  
  dnl The next test verifies that ct_clear at the datapath only gets executed
-@@ -11235,13 +11326,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -11235,13 +11392,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
  dnl Check this output.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_nw_src=10.1.2.100,ct_nw_dst=10.1.2.200,ct_nw_proto=17,ct_tp_src=6,ct_tp_dst=6,ip,in_port=2 (via action) data_len=106 (unbuffered)
@@ -62137,6 +62446,103 @@ index fc6253cfe9..920b833b72 100644
  
      join_cluster() {
          local i=$1
+diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
+index 62e2b63832..19493a9254 100644
+--- a/tests/ovsdb-idl.at
++++ b/tests/ovsdb-idl.at
+@@ -2437,3 +2437,92 @@ unix:socket2 remote has col id in table simple7
+ 
+ OVSDB_SERVER_SHUTDOWN
+ AT_CLEANUP
++
++dnl This test checks that inserting and deleting the source of a reference
++dnl doesn't remove the reference in the (deleted) source tracked record.
++OVSDB_CHECK_IDL_TRACK([track, insert and delete, refs to link1],
++  [],
++  [['["idltest",
++      {"op": "insert",
++       "table": "link2",
++       "uuid-name": "l2row0",
++       "row": {"i": 1, "l1": ["set", [["named-uuid", "l1row0"]]]}
++      },
++      {"op": "insert",
++       "table": "link1",
++       "uuid-name": "l1row0",
++       "row": {"i": 1, "k": ["named-uuid", "l1row0"]}
++      },
++      {"op": "insert",
++       "table": "link2",
++       "uuid-name": "l2row1",
++       "row": {"i": 2, "l1": ["set", [["named-uuid", "l1row0"]]]}
++      }
++    ]' \
++    '+["idltest",
++      {"op": "delete",
++       "table": "link2",
++       "where": [["i", "==", 2]]}
++       ]' \
++    '["idltest",
++      {"op": "delete",
++       "table": "link2",
++       "where": [["i", "==", 1]]}
++       ]'
++  ]],
++  [[000: empty
++001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]}
++002: {"error":null,"result":[{"count":1}]}
++003: table link1: inserted row: i=1 k=1 ka=[] l2= uuid=<1>
++003: table link1: updated columns: i k
++003: table link2: inserted row: i=1 l1=1 uuid=<0>
++003: table link2: inserted/deleted row: i=2 l1=1 uuid=<2>
++003: table link2: updated columns: i l1
++003: table link2: updated columns: i l1
++004: {"error":null,"result":[{"count":1}]}
++005: table link1: i=1 k=1 ka=[] l2= uuid=<1>
++006: done
++]])
++OVSDB_CHECK_IDL_TRACK([track, insert and delete, refs to link2],
++  [],
++  [['["idltest",
++      {"op": "insert",
++       "table": "link1",
++       "uuid-name": "l1row0",
++       "row": {"i": 1, "k": ["named-uuid", "l1row0"], "l2": ["set", [["named-uuid", "l2row0"]]]}
++      },
++      {"op": "insert",
++       "table": "link2",
++       "uuid-name": "l2row0",
++       "row": {"i": 1}
++      },
++      {"op": "insert",
++       "table": "link1",
++       "uuid-name": "l1row1",
++       "row": {"i": 2, "k": ["named-uuid", "l1row0"], "l2": ["set", [["named-uuid", "l2row0"]]]}
++      }
++    ]' \
++    '+["idltest",
++      {"op": "delete",
++       "table": "link1",
++       "where": [["i", "==", 2]]}
++       ]' \
++    '["idltest",
++      {"op": "delete",
++       "table": "link1",
++       "where": [["i", "==", 1]]}
++       ]'
++  ]],
++  [[000: empty
++001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]}
++002: {"error":null,"result":[{"count":1}]}
++003: table link1: inserted row: i=1 k=1 ka=[] l2=1 uuid=<0>
++003: table link1: inserted/deleted row: i=2 k=1 ka=[] l2=1 uuid=<2>
++003: table link1: updated columns: i k l2
++003: table link1: updated columns: i k l2
++003: table link2: inserted row: i=1 l1= uuid=<1>
++003: table link2: updated columns: i
++004: {"error":null,"result":[{"count":1}]}
++005: table link2: i=1 l1= uuid=<1>
++006: done
++]])
 diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at
 index 876cb836cd..e672c13b27 100644
 --- a/tests/ovsdb-server.at
@@ -63995,7 +64401,7 @@ index 9259b0b3fc..e50c7c3807 100644
          hmap_destroy(&hmap);
      }
 diff --git a/tests/test-list.c b/tests/test-list.c
-index 6f1fb059bc..2c6c444488 100644
+index 6f1fb059bc..ac82f2048e 100644
 --- a/tests/test-list.c
 +++ b/tests/test-list.c
 @@ -61,7 +61,7 @@ check_list(struct ovs_list *list, const int values[], size_t n)
@@ -64016,7 +64422,16 @@ index 6f1fb059bc..2c6c444488 100644
      assert(i == n);
  
      assert(ovs_list_is_empty(list) == !n);
-@@ -135,6 +135,13 @@ test_list_for_each_safe(void)
+@@ -106,6 +106,8 @@ test_list_construction(void)
+         int values[MAX_ELEMS];
+         struct ovs_list list;
+ 
++        memset(elements, 0, sizeof elements);
++        memset(values, 0, sizeof values);
+         make_list(&list, elements, values, n);
+         check_list(&list, values, n);
+     }
+@@ -135,6 +137,13 @@ test_list_for_each_safe(void)
              values_idx = 0;
              n_remaining = n;
              LIST_FOR_EACH_SAFE (e, next, node, &list) {
@@ -64030,7 +64445,7 @@ index 6f1fb059bc..2c6c444488 100644
                  assert(i < n);
                  if (pattern & (1ul << i)) {
                      ovs_list_remove(&e->node);
-@@ -148,7 +155,8 @@ test_list_for_each_safe(void)
+@@ -148,7 +157,8 @@ test_list_for_each_safe(void)
                  i++;
              }
              assert(i == n);
@@ -64040,7 +64455,7 @@ index 6f1fb059bc..2c6c444488 100644
  
              for (i = 0; i < n; i++) {
                  if (pattern & (1ul << i)) {
-@@ -156,6 +164,35 @@ test_list_for_each_safe(void)
+@@ -156,6 +166,35 @@ test_list_for_each_safe(void)
                  }
              }
              assert(n == n_remaining);
@@ -64077,7 +64492,7 @@ index 6f1fb059bc..2c6c444488 100644
      }
  }
 diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
-index ca4e87b811..3194f50f2d 100644
+index ca4e87b811..c7bc32a246 100644
 --- a/tests/test-ovsdb.c
 +++ b/tests/test-ovsdb.c
 @@ -294,11 +294,24 @@ print_and_free_ovsdb_error(struct ovsdb_error *error)
@@ -64321,6 +64736,26 @@ index ca4e87b811..3194f50f2d 100644
      /* Create table. */
      json = parse_json("{\"name\": \"testdb\", "
                        " \"tables\": "
+@@ -1885,11 +1946,14 @@ format_idl_row(const struct ovsdb_idl_row *row, int step, const char *contents,
+     const char *change_str =
+         !ovsdb_idl_track_is_set(row->table)
+         ? ""
+-        : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0
+-          ? "inserted row: "
+-          : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0
+-            ? "deleted row: "
+-            : "";
++        : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0 &&
++            ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0
++          ? "inserted/deleted row: "
++          : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0
++            ? "inserted row: "
++            : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0
++              ? "deleted row: "
++              : "";
+ 
+     if (terse) {
+         return xasprintf("%03d: table %s", step, row->table->class_->name);
 diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py
 index 853264f22b..402cacbe9d 100644
 --- a/tests/test-ovsdb.py
@@ -64414,6 +64849,18 @@ index f0fd042108..7d899fbbfd 100644
  
          /* Check maximum x such that f(x) == n. */
          check_ctz32(UINT32_MAX << n, n);
+diff --git a/tests/test-vconn.c b/tests/test-vconn.c
+index fc8ce4a2c0..96c89bd4e6 100644
+--- a/tests/test-vconn.c
++++ b/tests/test-vconn.c
+@@ -157,6 +157,7 @@ test_refuse_connection(struct ovs_cmdl_context *ctx)
+     error = vconn_connect_block(vconn, (TIMEOUT - 2) * 1000);
+     if (!strcmp(type, "tcp")) {
+         if (error != ECONNRESET && error != EPIPE && error != ETIMEDOUT
++            && error != ECONNREFUSED
+ #ifdef _WIN32
+             && error != WSAECONNRESET
+ #endif
 diff --git a/tests/tunnel-push-pop-ipv6.at b/tests/tunnel-push-pop-ipv6.at
 index 3f58e3e8fd..8c5af459e9 100644
 --- a/tests/tunnel-push-pop-ipv6.at
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index da25093..d70dfbc 100644
--- a/SPECS/openvswitch2.17.spec
+++ b/SPECS/openvswitch2.17.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.17.0
-Release: 45%{?dist}
+Release: 46%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -748,6 +748,20 @@ exit 0
 %endif
 
 %changelog
+* Fri Oct 07 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-46
+- Merging upstream branch-2.17 [RH git: b2b4334db0]
+    Commit list:
+    09e22fec45 daemon-unix: Fix file descriptor leak when monitor restarts child.
+    53df50db26 vconn: Allow ECONNREFUSED in refuse connection test.
+    26a11ca610 dpdk: Use DPDK 21.11.2 release.
+    edf699ec64 m4: Test avx512 for x86 only.
+    1989caf9ea ovsdb-idl: Preserve references for rows deleted in same IDL run as their insertion. (#2126450)
+    db6a612cd7 python: idl: Fix idl.Row.__str__ method.
+    73d7bf64a7 bond: Avoid deadlock while updating post recirculation rules.
+    70a63391cb ofproto-dpif-upcall: Add debug commands to pause/resume revalidators.
+    cf0e12f8ae test-list: Fix false-positive build failure with GCC 12.
+
+
 * Tue Oct 04 2022 Timothy Redaelli <tredaelli@redhat.com> - 2.17.0-45
 - redhat: get the NVR from spec file directly [RH git: f3b0501deb]
     Fixes: 339efe77c4c7 ("pkgtool: keep %{?dist} before added bz string")