diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index 3181760..1712036 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..392c7ee79c 100755
+index 6cd38ff3ef..74872753d0 100755
 --- a/.ci/linux-build.sh
 +++ b/.ci/linux-build.sh
 @@ -220,7 +220,7 @@ fi
@@ -11,6 +11,15 @@ index 6cd38ff3ef..392c7ee79c 100755
      fi
      install_dpdk $DPDK_VER
  fi
+@@ -233,7 +233,7 @@ elif [ "$M32" ]; then
+     # difference on 'configure' and 'make' stages.
+     export CC="$CC -m32"
+ elif [ "$TRAVIS_ARCH" != "aarch64" ]; then
+-    OPTS="--enable-sparse"
++    EXTRA_OPTS="$EXTRA_OPTS --enable-sparse"
+     if [ "$AFXDP" ]; then
+         # netdev-afxdp uses memset for 64M for umem initialization.
+         SPARSE_FLAGS="${SPARSE_FLAGS} -Wno-memcpy-max-count"
 @@ -244,9 +244,7 @@ fi
  if [ "$ASAN" ]; then
      # This will override default option configured in tests/atlocal.in.
@@ -212,13 +221,27 @@ index c4300cd53e..a297aadac8 100644
  
  - GNU make.
 diff --git a/NEWS b/NEWS
-index c10e9bfacc..b04b7b4c9d 100644
+index c10e9bfacc..45b974ed22 100644
 --- a/NEWS
 +++ b/NEWS
-@@ -1,3 +1,55 @@
-+v2.17.4 - xx xxx xxxx
+@@ -1,3 +1,69 @@
++v2.17.6 - xx xxx xxxx
 +---------------------
 +
++v2.17.5 - 20 Dec 2022
++---------------------
++   - Bug fixes
++   - Security:
++     * Fixed LLDP underflow issue while parsing malformed Auto Attach TLVs.
++       The original patch is available here:
++       https://mail.openvswitch.org/pipermail/ovs-dev/2022-December/400596.html
++
++v2.17.4 - 01 Dec 2022
++---------------------
++   - Bug fixes
++   - QoS:
++     * Fixed inability to apply QoS on ports with custom qdiscs.
++
 +v2.17.3 - 07 Oct 2022
 +---------------------
 +   - Bug fixes
@@ -473,7 +496,7 @@ index 1884c99e1f..aca1dbca91 100755
 +dhparam_to_c lib/dh4096.pem
 +echo "#endif"
 diff --git a/configure.ac b/configure.ac
-index 4e9bcce272..733068bfd2 100644
+index 4e9bcce272..64db07f27b 100644
 --- a/configure.ac
 +++ b/configure.ac
 @@ -13,7 +13,7 @@
@@ -481,7 +504,7 @@ index 4e9bcce272..733068bfd2 100644
  
  AC_PREREQ(2.63)
 -AC_INIT(openvswitch, 2.17.0, bugs@openvswitch.org)
-+AC_INIT(openvswitch, 2.17.4, bugs@openvswitch.org)
++AC_INIT(openvswitch, 2.17.6, bugs@openvswitch.org)
  AC_CONFIG_SRCDIR([datapath/datapath.c])
  AC_CONFIG_MACRO_DIR([m4])
  AC_CONFIG_AUX_DIR([build-aux])
@@ -733,15 +756,27 @@ index cc0840704a..2a206305ec 100644
          completionList->dropNbl = NULL;
          completionList->dropNblNext = &completionList->dropNbl;
 diff --git a/debian/changelog b/debian/changelog
-index 3e0d3a66e3..1a1f0984b3 100644
+index 3e0d3a66e3..11de722a81 100644
 --- a/debian/changelog
 +++ b/debian/changelog
-@@ -1,3 +1,27 @@
+@@ -1,3 +1,39 @@
++openvswitch (2.17.6-1) unstable; urgency=low
++   [ Open vSwitch team ]
++   * New upstream version
++
++ -- Open vSwitch team <dev@openvswitch.org>  Tue, 20 Dec 2022 20:06:56 +0100
++
++openvswitch (2.17.5-1) unstable; urgency=low
++   [ Open vSwitch team ]
++   * New upstream version
++
++ -- Open vSwitch team <dev@openvswitch.org>  Tue, 20 Dec 2022 20:06:56 +0100
++
 +openvswitch (2.17.4-1) unstable; urgency=low
 +   [ Open vSwitch team ]
 +   * New upstream version
 +
-+ -- Open vSwitch team <dev@openvswitch.org>  Fri, 07 Oct 2022 13:12:51 +0200
++ -- Open vSwitch team <dev@openvswitch.org>  Thu, 01 Dec 2022 13:16:55 +0100
 +
 +openvswitch (2.17.3-1) unstable; urgency=low
 +   [ Open vSwitch team ]
@@ -24167,7 +24202,7 @@ index d1230f94cb..b5cd6188b4 100644
  
  #endif /* _HNS3_STATS_H_ */
 diff --git a/dpdk/drivers/net/i40e/i40e_ethdev.c b/dpdk/drivers/net/i40e/i40e_ethdev.c
-index c0bfff43ee..bad27355fc 100644
+index c0bfff43ee..ecef1a6e7e 100644
 --- a/dpdk/drivers/net/i40e/i40e_ethdev.c
 +++ b/dpdk/drivers/net/i40e/i40e_ethdev.c
 @@ -386,6 +386,7 @@ static int i40e_set_default_mac_addr(struct rte_eth_dev *dev,
@@ -24289,7 +24324,7 @@ index c0bfff43ee..bad27355fc 100644
  struct i40e_ethertype_filter *
  i40e_sw_ethertype_filter_lookup(struct i40e_ethertype_rule *ethertype_rule,
  				const struct i40e_ethertype_filter_input *input)
-@@ -12103,6 +12105,35 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf)
+@@ -12103,6 +12105,40 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf)
  	return ret;
  }
  
@@ -24302,8 +24337,13 @@ index c0bfff43ee..bad27355fc 100644
 +	enum i40e_status_code status;
 +	bool can_be_set = true;
 +
-+	/* I40E_MEDIA_TYPE_BASET link up can be ignored */
-+	if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET) {
++	/*
++	 * I40E_MEDIA_TYPE_BASET link up can be ignored
++	 * I40E_MEDIA_TYPE_BASET link down that hw->phy.media_type
++	 * is I40E_MEDIA_TYPE_UNKNOWN
++	 */
++	if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET &&
++	    hw->phy.media_type != I40E_MEDIA_TYPE_UNKNOWN) {
 +		do {
 +			update_link_reg(hw, &link);
 +			if (link.link_status)
@@ -49522,7 +49562,7 @@ index 926b5c0bd9..7d1d6a1861 100644
  			goto error_exit;
  		}
 diff --git a/dpdk/lib/vhost/vhost_user.c b/dpdk/lib/vhost/vhost_user.c
-index a781346c4d..df780fd7d6 100644
+index a781346c4d..2b45e35d4a 100644
 --- a/dpdk/lib/vhost/vhost_user.c
 +++ b/dpdk/lib/vhost/vhost_user.c
 @@ -143,57 +143,59 @@ get_blk_size(int fd)
@@ -49802,7 +49842,7 @@ index a781346c4d..df780fd7d6 100644
  	fd = msg->fds[0];
  	if (msg->size != sizeof(msg->payload.inflight) || fd < 0) {
  		VHOST_LOG_CONFIG(ERR,
-@@ -2566,8 +2572,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg,
+@@ -2566,8 +2572,12 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg,
  			vhost_user_iotlb_cache_insert(vq, imsg->iova, vva,
  					len, imsg->perm);
  
@@ -49810,12 +49850,13 @@ index a781346c4d..df780fd7d6 100644
 +			if (is_vring_iotlb(dev, vq, imsg)) {
 +				rte_spinlock_lock(&vq->access_lock);
  				*pdev = dev = translate_ring_addresses(dev, i);
++				vq = dev->virtqueue[i];
 +				rte_spinlock_unlock(&vq->access_lock);
 +			}
  		}
  		break;
  	case VHOST_IOTLB_INVALIDATE:
-@@ -2580,8 +2589,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg,
+@@ -2580,8 +2590,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg,
  			vhost_user_iotlb_cache_remove(vq, imsg->iova,
  					imsg->size);
  
@@ -49828,7 +49869,7 @@ index a781346c4d..df780fd7d6 100644
  		}
  		break;
  	default:
-@@ -2873,6 +2885,9 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev,
+@@ -2873,6 +2886,9 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev,
  	case VHOST_USER_SET_VRING_ADDR:
  		vring_idx = msg->payload.addr.index;
  		break;
@@ -49838,7 +49879,7 @@ index a781346c4d..df780fd7d6 100644
  	default:
  		return 0;
  	}
-@@ -2961,7 +2976,6 @@ vhost_user_msg_handler(int vid, int fd)
+@@ -2961,7 +2977,6 @@ vhost_user_msg_handler(int vid, int fd)
  		return -1;
  	}
  
@@ -49846,7 +49887,7 @@ index a781346c4d..df780fd7d6 100644
  	request = msg.request.master;
  	if (request > VHOST_USER_NONE && request < VHOST_USER_MAX &&
  			vhost_message_str[request]) {
-@@ -3103,9 +3117,11 @@ vhost_user_msg_handler(int vid, int fd)
+@@ -3103,9 +3118,11 @@ vhost_user_msg_handler(int vid, int fd)
  	} else if (ret == RTE_VHOST_MSG_RESULT_ERR) {
  		VHOST_LOG_CONFIG(ERR,
  			"vhost message handling failed.\n");
@@ -49859,7 +49900,7 @@ index a781346c4d..df780fd7d6 100644
  	for (i = 0; i < dev->nr_vring; i++) {
  		struct vhost_virtqueue *vq = dev->virtqueue[i];
  		bool cur_ready = vq_is_ready(dev, vq);
-@@ -3116,10 +3132,11 @@ vhost_user_msg_handler(int vid, int fd)
+@@ -3116,10 +3133,11 @@ vhost_user_msg_handler(int vid, int fd)
  		}
  	}
  
@@ -49872,7 +49913,7 @@ index a781346c4d..df780fd7d6 100644
  		goto out;
  
  	/*
-@@ -3146,7 +3163,7 @@ vhost_user_msg_handler(int vid, int fd)
+@@ -3146,7 +3164,7 @@ vhost_user_msg_handler(int vid, int fd)
  	}
  
  out:
@@ -51574,7 +51615,7 @@ index 66016eb099..7425dd44e7 100644
      /* Statistics. */
      struct dp_netdev_flow_stats stats;
 diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
-index 9f35713ef5..24b64b1686 100644
+index 9f35713ef5..b9cafc2737 100644
 --- a/lib/dpif-netdev.c
 +++ b/lib/dpif-netdev.c
 @@ -93,7 +93,8 @@ VLOG_DEFINE_THIS_MODULE(dpif_netdev);
@@ -51629,7 +51670,36 @@ index 9f35713ef5..24b64b1686 100644
  
      item->timestamp = pmd->ctx.now;
      dp_netdev_offload_flow_enqueue(item);
-@@ -4095,6 +4095,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
+@@ -3335,6 +3335,28 @@ netdev_flow_key_init_masked(struct netdev_flow_key *dst,
+                             (dst_u64 - miniflow_get_values(&dst->mf)) * 8);
+ }
+ 
++/* Initializes 'key' as a copy of 'flow'. */
++static inline void
++netdev_flow_key_init(struct netdev_flow_key *key,
++                     const struct flow *flow)
++{
++    uint64_t *dst = miniflow_values(&key->mf);
++    uint32_t hash = 0;
++    uint64_t value;
++
++    miniflow_map_init(&key->mf, flow);
++    miniflow_init(&key->mf, flow);
++
++    size_t n = dst - miniflow_get_values(&key->mf);
++
++    FLOW_FOR_EACH_IN_MAPS (value, flow, key->mf.map) {
++        hash = hash_add64(hash, value);
++    }
++
++    key->hash = hash_finish(hash, n * 8);
++    key->len = netdev_flow_key_size(n);
++}
++
+ static inline void
+ emc_change_entry(struct emc_entry *ce, struct dp_netdev_flow *flow,
+                  const struct netdev_flow_key *key)
+@@ -4095,6 +4117,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
      flow->dead = false;
      flow->batch = NULL;
      flow->mark = INVALID_FLOW_MARK;
@@ -51637,7 +51707,7 @@ index 9f35713ef5..24b64b1686 100644
      *CONST_CAST(unsigned *, &flow->pmd_id) = pmd->core_id;
      *CONST_CAST(struct flow *, &flow->flow) = match->flow;
      *CONST_CAST(ovs_u128 *, &flow->ufid) = *ufid;
-@@ -4129,7 +4130,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
+@@ -4129,7 +4152,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
      }
  
      queue_netdev_flow_put(pmd, flow, match, actions, actions_len,
@@ -51646,7 +51716,7 @@ index 9f35713ef5..24b64b1686 100644
      log_netdev_flow_change(flow, match, NULL, actions, actions_len);
  
      return flow;
-@@ -4171,7 +4172,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
+@@ -4171,7 +4194,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
              ovsrcu_set(&netdev_flow->actions, new_actions);
  
              queue_netdev_flow_put(pmd, netdev_flow, match,
@@ -51655,7 +51725,32 @@ index 9f35713ef5..24b64b1686 100644
                                    DP_NETDEV_FLOW_OFFLOAD_OP_MOD);
              log_netdev_flow_change(netdev_flow, match, old_actions,
                                     put->actions, put->actions_len);
-@@ -4778,8 +4779,8 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4208,7 +4231,7 @@ static int
+ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
+ {
+     struct dp_netdev *dp = get_dp_netdev(dpif);
+-    struct netdev_flow_key key, mask;
++    struct netdev_flow_key key;
+     struct dp_netdev_pmd_thread *pmd;
+     struct match match;
+     ovs_u128 ufid;
+@@ -4257,9 +4280,12 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
+ 
+     /* Must produce a netdev_flow_key for lookup.
+      * Use the same method as employed to create the key when adding
+-     * the flow to the dplcs to make sure they match. */
+-    netdev_flow_mask_init(&mask, &match);
+-    netdev_flow_key_init_masked(&key, &match.flow, &mask);
++     * the flow to the dplcs to make sure they match.
++     * We need to put in the unmasked key as flow_put_on_pmd() will first try
++     * to see if an entry exists doing a packet type lookup. As masked-out
++     * fields are interpreted as zeros, they could falsely match a wider IP
++     * address mask. Installation of the flow will use the match variable. */
++    netdev_flow_key_init(&key, &match.flow);
+ 
+     if (put->pmd_id == PMD_ID_NULL) {
+         if (cmap_count(&dp->poll_threads) == 0) {
+@@ -4778,8 +4804,8 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
      uint32_t insert_min, cur_min;
      uint32_t tx_flush_interval, cur_tx_flush_interval;
      uint64_t rebalance_intvl;
@@ -51666,7 +51761,7 @@ index 9f35713ef5..24b64b1686 100644
      bool log_autolb = false;
      enum sched_assignment_type pmd_rxq_assign_type;
  
-@@ -4880,8 +4881,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4880,8 +4906,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
  
      struct pmd_auto_lb *pmd_alb = &dp->pmd_alb;
  
@@ -51681,7 +51776,7 @@ index 9f35713ef5..24b64b1686 100644
  
      /* Input is in min, convert it to msec. */
      rebalance_intvl =
-@@ -4894,21 +4899,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4894,21 +4924,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
          log_autolb = true;
      }
  
@@ -51709,7 +51804,7 @@ index 9f35713ef5..24b64b1686 100644
      if (rebalance_load > 100) {
          rebalance_load = ALB_LOAD_THRESHOLD;
      }
-@@ -4916,7 +4921,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4916,7 +4946,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
      if (rebalance_load != cur_rebalance_load) {
          atomic_store_relaxed(&pmd_alb->rebalance_load_thresh,
                               rebalance_load);
@@ -51718,7 +51813,7 @@ index 9f35713ef5..24b64b1686 100644
                    rebalance_load);
          log_autolb = true;
      }
-@@ -5425,7 +5430,6 @@ port_reconfigure(struct dp_netdev_port *port)
+@@ -5425,7 +5455,6 @@ port_reconfigure(struct dp_netdev_port *port)
  
          port->rxqs[i].port = port;
          port->rxqs[i].is_vhost = !strncmp(port->type, "dpdkvhost", 9);
@@ -51726,7 +51821,7 @@ index 9f35713ef5..24b64b1686 100644
  
          err = netdev_rxq_open(netdev, &port->rxqs[i].rx, i);
          if (err) {
-@@ -5684,23 +5688,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list)
+@@ -5684,23 +5713,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list)
      }
  }
  
@@ -51760,7 +51855,7 @@ index 9f35713ef5..24b64b1686 100644
                      rxq->pmd->numa_id !=
                          netdev_get_numa_id(rxq->port->netdev)) {
                      return true;
-@@ -6000,10 +6009,10 @@ sched_numa_list_schedule(struct sched_numa_list *numa_list,
+@@ -6000,10 +6034,10 @@ sched_numa_list_schedule(struct sched_numa_list *numa_list,
              /* Find any numa with available PMDs. */
              for (int j = 0; j < n_numa; j++) {
                  numa = sched_numa_list_next(numa_list, last_cross_numa);
@@ -51772,7 +51867,7 @@ index 9f35713ef5..24b64b1686 100644
                  numa = NULL;
              }
          }
-@@ -6111,7 +6120,7 @@ sched_numa_list_variance(struct sched_numa_list *numa_list)
+@@ -6111,7 +6145,7 @@ sched_numa_list_variance(struct sched_numa_list *numa_list)
   * pmd_rebalance_dry_run() can be avoided when it is not needed.
   */
  static bool
@@ -51781,7 +51876,7 @@ index 9f35713ef5..24b64b1686 100644
      OVS_REQ_RDLOCK(dp->port_rwlock)
  {
      struct dp_netdev_pmd_thread *pmd;
-@@ -6342,11 +6351,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
+@@ -6342,11 +6376,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
      OVS_EXCLUDED(pmd->port_mutex)
      OVS_REQ_RDLOCK(dp->port_rwlock)
  {
@@ -51796,7 +51891,7 @@ index 9f35713ef5..24b64b1686 100644
          struct dp_netdev_port *port = poll->rxq->port;
  
          if (port->need_reconfigure
-@@ -6354,7 +6363,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
+@@ -6354,7 +6388,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
              dp_netdev_del_rxq_from_pmd(pmd, poll);
          }
      }
@@ -51805,7 +51900,7 @@ index 9f35713ef5..24b64b1686 100644
          struct dp_netdev_port *port = tx->port;
  
          if (port->need_reconfigure
-@@ -6430,8 +6439,7 @@ reconfigure_datapath(struct dp_netdev *dp)
+@@ -6430,8 +6464,7 @@ reconfigure_datapath(struct dp_netdev *dp)
      /* We only reconfigure the ports that we determined above, because they're
       * not being used by any pmd thread at the moment.  If a port fails to
       * reconfigure we remove it from the datapath. */
@@ -51815,7 +51910,7 @@ index 9f35713ef5..24b64b1686 100644
          int err;
  
          if (!port->need_reconfigure) {
-@@ -6487,10 +6495,10 @@ reconfigure_datapath(struct dp_netdev *dp)
+@@ -6487,10 +6520,10 @@ reconfigure_datapath(struct dp_netdev *dp)
      }
  
      CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
@@ -51828,7 +51923,7 @@ index 9f35713ef5..24b64b1686 100644
              if (poll->rxq->pmd != pmd) {
                  dp_netdev_del_rxq_from_pmd(pmd, poll);
  
-@@ -6682,7 +6690,7 @@ dpif_netdev_run(struct dpif *dpif)
+@@ -6682,7 +6715,7 @@ dpif_netdev_run(struct dpif *dpif)
              if (pmd_rebalance &&
                  !dp_netdev_is_reconf_required(dp) &&
                  !ports_require_restart(dp) &&
@@ -51837,7 +51932,7 @@ index 9f35713ef5..24b64b1686 100644
                  pmd_rebalance_dry_run(dp)) {
                  VLOG_INFO("PMD auto load balance dry run. "
                            "Requesting datapath reconfigure.");
-@@ -7364,15 +7372,15 @@ static struct dp_netdev_pmd_thread *
+@@ -7364,15 +7397,15 @@ static struct dp_netdev_pmd_thread *
  dp_netdev_get_pmd(struct dp_netdev *dp, unsigned core_id)
  {
      struct dp_netdev_pmd_thread *pmd;
@@ -51859,7 +51954,7 @@ index 9f35713ef5..24b64b1686 100644
  }
  
  /* Sets the 'struct dp_netdev_pmd_thread' for non-pmd threads. */
-@@ -7505,6 +7513,7 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
+@@ -7505,6 +7538,7 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
      seq_destroy(pmd->reload_seq);
      ovs_mutex_destroy(&pmd->port_mutex);
      ovs_mutex_destroy(&pmd->bond_mutex);
@@ -51867,7 +51962,7 @@ index 9f35713ef5..24b64b1686 100644
      free(pmd);
  }
  
-@@ -8020,17 +8029,15 @@ dp_netdev_hw_flow(const struct dp_netdev_pmd_thread *pmd,
+@@ -8020,17 +8054,15 @@ dp_netdev_hw_flow(const struct dp_netdev_pmd_thread *pmd,
  #ifdef ALLOW_EXPERIMENTAL_API /* Packet restoration API required. */
      /* Restore the packet if HW processing was terminated before completion. */
      struct dp_netdev_rxq *rxq = pmd->ctx.last_rxq;
@@ -52666,6 +52761,26 @@ index e70a2b7048..34bb7e3d69 100644
  Libs.private: @LIBS@
 -Cflags: -I${includedir}/openvswitch
 +Cflags: -I${includedir}
+diff --git a/lib/lldp/lldp.c b/lib/lldp/lldp.c
+index dfeb2a8002..6fdcfef569 100644
+--- a/lib/lldp/lldp.c
++++ b/lib/lldp/lldp.c
+@@ -583,6 +583,7 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s,
+ 
+                 switch(tlv_subtype) {
+                 case LLDP_TLV_AA_ELEMENT_SUBTYPE:
++                    CHECK_TLV_SIZE(50, "ELEMENT");
+                     PEEK_BYTES(&msg_auth_digest, sizeof msg_auth_digest);
+ 
+                     aa_element_dword = PEEK_UINT32;
+@@ -629,6 +630,7 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s,
+                     break;
+ 
+                 case LLDP_TLV_AA_ISID_VLAN_ASGNS_SUBTYPE:
++                    CHECK_TLV_SIZE(36, "ISID_VLAN_ASGNS");
+                     PEEK_BYTES(&msg_auth_digest, sizeof msg_auth_digest);
+ 
+                     /* Subtract off tlv type and length (2Bytes) + OUI (3B) +
 diff --git a/lib/lldp/lldpd-structs.c b/lib/lldp/lldpd-structs.c
 index 499b441746..a8c7fad098 100644
 --- a/lib/lldp/lldpd-structs.c
@@ -54202,7 +54317,7 @@ index 8305f6c427..c797783782 100644
  
                  /* By default enable one tx and rx queue per netdev. */
 diff --git a/lib/odp-util.c b/lib/odp-util.c
-index 9a705cffa3..3bbc9a1010 100644
+index 9a705cffa3..fac4cf3a8c 100644
 --- a/lib/odp-util.c
 +++ b/lib/odp-util.c
 @@ -1003,7 +1003,7 @@ format_odp_conntrack_action(struct ds *ds, const struct nlattr *attr)
@@ -54236,7 +54351,34 @@ index 9a705cffa3..3bbc9a1010 100644
          }
          ds_put_char(ds, ',');
      }
-@@ -4630,6 +4630,11 @@ odp_flow_format(const struct nlattr *key, size_t key_len,
+@@ -3592,9 +3592,16 @@ static bool
+ check_attr_len(struct ds *ds, const struct nlattr *a, const struct nlattr *ma,
+                const struct attr_len_tbl tbl[], int max_type, bool need_key)
+ {
++    uint16_t type = nl_attr_type(a);
+     int expected_len;
+ 
+-    expected_len = odp_key_attr_len(tbl, max_type, nl_attr_type(a));
++    if (type > max_type) {
++        /* Unknown attribute, can't check the length. */
++        return true;
++    }
++
++    expected_len = odp_key_attr_len(tbl, max_type, type);
++
+     if (expected_len != ATTR_LEN_VARIABLE &&
+         expected_len != ATTR_LEN_NESTED) {
+ 
+@@ -3603,7 +3610,7 @@ check_attr_len(struct ds *ds, const struct nlattr *a, const struct nlattr *ma,
+ 
+         if (bad_key_len || bad_mask_len) {
+             if (need_key) {
+-                ds_put_format(ds, "key%u", nl_attr_type(a));
++                ds_put_format(ds, "key%u", type);
+             }
+             if (bad_key_len) {
+                 ds_put_format(ds, "(bad key length %"PRIuSIZE", expected %d)(",
+@@ -4630,6 +4637,11 @@ odp_flow_format(const struct nlattr *key, size_t key_len,
                      ds_put_char(ds, ',');
                  }
                  ds_put_cstr(ds, "eth()");
@@ -54248,7 +54390,7 @@ index 9a705cffa3..3bbc9a1010 100644
              }
              ofpbuf_clear(&ofp);
          }
-@@ -7161,11 +7166,6 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
+@@ -7161,11 +7173,6 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
                  }
              }
          }
@@ -54260,7 +54402,7 @@ index 9a705cffa3..3bbc9a1010 100644
      }
      if (is_mask && expected_bit != OVS_KEY_ATTR_UNSPEC) {
          if ((flow->tp_src || flow->tp_dst) && flow->nw_proto != 0xff) {
-@@ -7188,7 +7188,8 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
+@@ -7188,7 +7195,8 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
                     uint64_t present_attrs, int out_of_range_attr,
                     uint64_t expected_attrs, struct flow *flow,
                     const struct nlattr *key, size_t key_len,
@@ -54270,7 +54412,7 @@ index 9a705cffa3..3bbc9a1010 100644
  {
      static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
      bool is_mask = src_flow != flow;
-@@ -7196,9 +7197,11 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
+@@ -7196,9 +7204,11 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
      const struct nlattr *encap;
      enum odp_key_fitness encap_fitness;
      enum odp_key_fitness fitness = ODP_FIT_ERROR;
@@ -54283,7 +54425,7 @@ index 9a705cffa3..3bbc9a1010 100644
             (is_mask
              ? (src_flow->vlans[encaps].tci & htons(VLAN_CFI)) != 0
              : eth_type_vlan(flow->dl_type))) {
-@@ -7259,6 +7262,14 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
+@@ -7259,6 +7269,14 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
          }
          expected_attrs = 0;
  
@@ -54298,7 +54440,7 @@ index 9a705cffa3..3bbc9a1010 100644
          if (!parse_ethertype(attrs, present_attrs, &expected_attrs,
                               flow, src_flow, errorp)) {
              return ODP_FIT_ERROR;
-@@ -7281,7 +7292,7 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
+@@ -7281,7 +7299,7 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1],
  static enum odp_key_fitness
  odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len,
                         struct flow *flow, const struct flow *src_flow,
@@ -54307,7 +54449,7 @@ index 9a705cffa3..3bbc9a1010 100644
  {
      /* New "struct flow" fields that are visible to the datapath (including all
       * data fields) should be translated from equivalent datapath flow fields
-@@ -7308,6 +7319,14 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len,
+@@ -7308,6 +7326,14 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len,
      }
      expected_attrs = 0;
  
@@ -54322,7 +54464,7 @@ index 9a705cffa3..3bbc9a1010 100644
      /* Metadata. */
      if (present_attrs & (UINT64_C(1) << OVS_KEY_ATTR_RECIRC_ID)) {
          flow->recirc_id = nl_attr_get_u32(attrs[OVS_KEY_ATTR_RECIRC_ID]);
-@@ -7431,7 +7450,7 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len,
+@@ -7431,7 +7457,7 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len,
          : eth_type_vlan(src_flow->dl_type)) {
          fitness = parse_8021q_onward(attrs, present_attrs, out_of_range_attr,
                                       expected_attrs, flow, key, key_len,
@@ -54331,7 +54473,7 @@ index 9a705cffa3..3bbc9a1010 100644
      } else {
          if (is_mask) {
              /* A missing VLAN mask means exact match on vlan_tci 0 (== no
-@@ -7497,7 +7516,7 @@ enum odp_key_fitness
+@@ -7497,7 +7523,7 @@ enum odp_key_fitness
  odp_flow_key_to_flow(const struct nlattr *key, size_t key_len,
                       struct flow *flow, char **errorp)
  {
@@ -54340,7 +54482,7 @@ index 9a705cffa3..3bbc9a1010 100644
  }
  
  /* Converts the 'mask_key_len' bytes of OVS_KEY_ATTR_* attributes in 'mask_key'
-@@ -7509,14 +7528,16 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t key_len,
+@@ -7509,14 +7535,16 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t key_len,
   * If 'errorp' is nonnull, this function uses it for detailed error reports: if
   * the return value is ODP_FIT_ERROR, it stores a malloc()'d error string in
   * '*errorp', otherwise NULL. */
@@ -54362,7 +54504,7 @@ index 9a705cffa3..3bbc9a1010 100644
      } else {
          if (errorp) {
              *errorp = NULL;
-@@ -7530,6 +7551,15 @@ odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len,
+@@ -7530,6 +7558,15 @@ odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len,
      }
  }
  
@@ -54378,7 +54520,7 @@ index 9a705cffa3..3bbc9a1010 100644
  /* Converts the netlink formated key/mask to match.
   * Fails if odp_flow_key_from_key/mask and odp_flow_key_key/mask
   * disagree on the acceptable form of flow */
-@@ -7540,12 +7570,15 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len,
+@@ -7540,12 +7577,15 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len,
  {
      enum odp_key_fitness fitness;
  
@@ -54399,7 +54541,7 @@ index 9a705cffa3..3bbc9a1010 100644
          static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
  
          if (!VLOG_DROP_ERR(&rl)) {
-@@ -7553,20 +7586,18 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len,
+@@ -7553,20 +7593,18 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len,
  
              ds_init(&s);
              odp_flow_format(key, key_len, NULL, 0, NULL, &s, true);
@@ -54852,9 +54994,18 @@ index 3b444ccdcc..aac5e19c99 100644
  
  #endif /* ovs-thread.h */
 diff --git a/lib/ovsdb-cs.c b/lib/ovsdb-cs.c
-index dead31275d..9713c7dc7c 100644
+index dead31275d..a7d2f73cc2 100644
 --- a/lib/ovsdb-cs.c
 +++ b/lib/ovsdb-cs.c
+@@ -892,7 +892,7 @@ ovsdb_cs_db_get_table(struct ovsdb_cs_db *db, const char *table)
+ 
+     t = xzalloc(sizeof *t);
+     t->name = xstrdup(table);
+-    t->new_cond = json_array_create_1(json_boolean_create(true));
++    t->ack_cond = json_array_create_1(json_boolean_create(true));
+     hmap_insert(&db->tables, &t->hmap_node, hash);
+     return t;
+ }
 @@ -900,8 +900,8 @@ ovsdb_cs_db_get_table(struct ovsdb_cs_db *db, const char *table)
  static void
  ovsdb_cs_db_destroy_tables(struct ovsdb_cs_db *db)
@@ -55323,10 +55474,10 @@ index 4e751ff2c7..70fabeb8a3 100644
  #ifdef _WIN32
          if (node->wevent && node->pollfd.fd) {
 diff --git a/lib/rculist.h b/lib/rculist.h
-index 1072b87af2..9bb8cbf3eb 100644
+index 1072b87af2..6df963eb2b 100644
 --- a/lib/rculist.h
 +++ b/lib/rculist.h
-@@ -365,35 +365,57 @@ rculist_is_singleton_protected(const struct rculist *list)
+@@ -365,35 +365,59 @@ rculist_is_singleton_protected(const struct rculist *list)
      return list_next == list->prev && list_next != list;
  }
  
@@ -55373,12 +55524,14 @@ index 1072b87af2..9bb8cbf3eb 100644
 +         UPDATE_MULTIVAR(ITER, rculist_next(ITER_VAR(ITER))))
 +
 +#define RCULIST_FOR_EACH_REVERSE_PROTECTED(ITER, MEMBER, RCULIST)             \
-+    for (INIT_MULTIVAR(ITER, MEMBER, (RCULIST)->prev, struct rculist);        \
++    for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(RCULIST),         \
++                       struct rculist);                                       \
 +         CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST));       \
-+         UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))
++         UPDATE_MULTIVAR(ITER, rculist_back_protected(ITER_VAR(ITER))))
 +
 +#define RCULIST_FOR_EACH_REVERSE_PROTECTED_CONTINUE(ITER, MEMBER, RCULIST)    \
-+    for (INIT_MULTIVAR(ITER, MEMBER, (ITER)->MEMBER.prev, struct rculist);    \
++    for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(ITER->MEMBER),    \
++                       struct rculist);                                       \
 +         CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST));       \
 +         UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev))
 +
@@ -60123,9 +60276,21 @@ index ef7bb4b8ee..c36a140a8e 100644
 -#endif
  }
 diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
-index 4ecdcaa197..8e31e02d79 100644
+index 4ecdcaa197..08846b0d51 100644
 --- a/python/ovs/db/idl.py
 +++ b/python/ovs/db/idl.py
+@@ -85,9 +85,9 @@ class Monitor(enum.IntEnum):
+ 
+ class ConditionState(object):
+     def __init__(self):
+-        self._ack_cond = None
++        self._ack_cond = [True]
+         self._req_cond = None
+-        self._new_cond = [True]
++        self._new_cond = None
+ 
+     def __iter__(self):
+         return iter([self._new_cond, self._req_cond, self._ack_cond])
 @@ -140,6 +140,47 @@ class ConditionState(object):
          return False
  
@@ -61167,7 +61332,7 @@ index 00e3a46b8b..b6155af253 100644
  
  AT_CLEANUP
 diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
-index a79ebdb618..6aff1eda7b 100644
+index a79ebdb618..9af70a68d7 100644
 --- a/tests/dpif-netdev.at
 +++ b/tests/dpif-netdev.at
 @@ -6,8 +6,8 @@ m4_divert_push([PREPARE_TESTS])
@@ -61241,6 +61406,27 @@ index a79ebdb618..6aff1eda7b 100644
  ])
  
     OVS_VSWITCHD_STOP
+@@ -636,6 +636,20 @@ OVS_VSWITCHD_STOP(["/flow: in_port is not an exact match/d
+ /failed to put/d"])
+ AT_CLEANUP
+ 
++AT_SETUP([dpif-netdev - check dpctl/add-flow wider ip match])
++OVS_VSWITCHD_START(
++  [add-port br0 p1 \
++   -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock \
++   -- set bridge br0 datapath-type=dummy])
++
++AT_CHECK([ovs-appctl revalidator/pause])
++AT_CHECK([ovs-appctl dpctl/add-flow "in_port(1),eth_type(0x0800),ipv4(src=0.0.0.0/192.0.0.0,dst=0.0.0.0/192.0.0.0,frag=no)" "3"])
++AT_CHECK([ovs-appctl dpctl/add-flow "in_port(1),eth_type(0x0800),ipv4(src=192.1.1.1/0.0.0.0,dst=49.1.1.1/0.0.0.0,frag=no)" "3"])
++AT_CHECK([ovs-appctl revalidator/resume])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
++
+ # SEND_UDP_PKTS([p_name], [p_ofport])
+ #
+ # Sends 128 packets to port 'p_name' with different UDP destination ports.
 diff --git a/tests/drop-stats.at b/tests/drop-stats.at
 index f3e19cd83b..1d3af98dab 100644
 --- a/tests/drop-stats.at
@@ -61577,10 +61763,10 @@ index 2c7e163bd6..7be6628c34 100644
  AT_CLEANUP
  
 diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
-index 7c2edeb9d4..73a5e8c3d0 100644
+index 7c2edeb9d4..bc981f8fc6 100644
 --- a/tests/ofproto-dpif.at
 +++ b/tests/ofproto-dpif.at
-@@ -29,6 +29,39 @@ AT_CHECK([ovs-appctl revalidator/wait])
+@@ -29,6 +29,58 @@ AT_CHECK([ovs-appctl revalidator/wait])
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
@@ -61617,10 +61803,29 @@ index 7c2edeb9d4..73a5e8c3d0 100644
 +OVS_VSWITCHD_STOP
 +AT_CLEANUP
 +
++AT_SETUP([ofproto-dpif - malformed lldp autoattach tlv])
++OVS_VSWITCHD_START()
++add_of_ports br0 1
++
++dnl Enable lldp
++AT_CHECK([ovs-vsctl set interface p1 lldp:enable=true])
++
++dnl Send a malformed lldp packet
++packet="0180c200000ef6b426aa5f0088cc020704f6b426aa5f000403057632060200780c"dnl
++"5044454144424545464445414442454546444541444245454644454144424545464445414"dnl
++"4424545464445414442454546444541444245454644454144424545464445414442454546"dnl
++"4445414442454546fe0500040d0c010000"
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 "$packet"], [0], [stdout])
++
++OVS_WAIT_UNTIL([grep -q "ISID_VLAN_ASGNS TLV too short" ovs-vswitchd.log])
++
++OVS_VSWITCHD_STOP(["/|WARN|ISID_VLAN_ASGNS TLV too short received on/d"])
++AT_CLEANUP
++
  AT_SETUP([ofproto-dpif - active-backup bonding (with primary)])
  
  dnl Create br0 with members p1, p2 and p7, creating bond0 with p1 and
-@@ -81,11 +114,12 @@ recirc_id(0),in_port(4),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=ff:
+@@ -81,11 +133,12 @@ recirc_id(0),in_port(4),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=ff:
  
  ovs-appctl netdev-dummy/set-admin-state p1 up
  ovs-appctl time/warp 100
@@ -61634,7 +61839,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  updelay: 0 ms
  downdelay: 0 ms
  lacp_status: off
-@@ -99,7 +133,6 @@ member p1: enabled
+@@ -99,7 +152,6 @@ member p1: enabled
  
  member p2: enabled
    may_enable: true
@@ -61642,7 +61847,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -126,14 +159,15 @@ dnl bring the primary back and verify that we switched back to the
+@@ -126,14 +178,15 @@ dnl bring the primary back and verify that we switched back to the
  dnl primary.
  ovs-appctl netdev-dummy/set-admin-state p1 down
  ovs-appctl time/warp 100
@@ -61660,7 +61865,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  updelay: 0 ms
  downdelay: 0 ms
  lacp_status: off
-@@ -150,14 +184,13 @@ member p2: enabled
+@@ -150,14 +203,13 @@ member p2: enabled
  
  member p3: enabled
    may_enable: true
@@ -61676,7 +61881,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  
  dnl Now re-add the primary and verify that the output shows that the
  dnl primary is available again.
-@@ -171,11 +204,12 @@ ovs-vsctl \
+@@ -171,11 +223,12 @@ ovs-vsctl \
     --id=@p1 create Interface name=p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p1.sock ofport_request=1 -- \
     set Port bond0 interfaces="$uuids, @p1]"
  ovs-appctl time/warp 100
@@ -61690,7 +61895,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  updelay: 0 ms
  downdelay: 0 ms
  lacp_status: off
-@@ -192,17 +226,17 @@ member p2: enabled
+@@ -192,17 +245,17 @@ member p2: enabled
  
  member p3: enabled
    may_enable: true
@@ -61710,7 +61915,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  updelay: 0 ms
  downdelay: 0 ms
  lacp_status: off
-@@ -211,25 +245,25 @@ active-backup primary: p2
+@@ -211,25 +264,25 @@ active-backup primary: p2
  <active member mac del>
  
  member p1: enabled
@@ -61739,7 +61944,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  updelay: 0 ms
  downdelay: 0 ms
  lacp_status: off
-@@ -238,15 +272,14 @@ active-backup primary: <none>
+@@ -238,15 +291,14 @@ active-backup primary: <none>
  <active member mac del>
  
  member p1: enabled
@@ -61756,7 +61961,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -336,9 +369,9 @@ ovs-appctl time/warp 100
+@@ -336,9 +388,9 @@ ovs-appctl time/warp 100
  AT_CHECK([ovs-appctl dpif/dump-flows br1 > br1_flows.txt])
  # Make sure there is resonable distribution to all three ports.
  # We don't want to make this check precise, in case hash function changes.
@@ -61769,7 +61974,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -498,6 +531,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore])
+@@ -498,6 +550,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore])
  OVS_VSWITCHD_STOP()
  AT_CLEANUP
  
@@ -61842,7 +62047,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  
  # 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)
+@@ -570,7 +688,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])
@@ -61851,7 +62056,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
  ])
-@@ -584,7 +683,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
+@@ -584,7 +702,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])
@@ -61860,7 +62065,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10,11
  ])
-@@ -600,7 +699,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2)
+@@ -600,7 +718,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])
@@ -61869,7 +62074,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +716,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
+@@ -617,7 +735,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])
@@ -61878,7 +62083,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +734,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip
+@@ -635,7 +753,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])
@@ -61887,7 +62092,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +748,7 @@ add_of_ports br0 1 10 11
+@@ -649,7 +767,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'])
@@ -61896,7 +62101,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +760,7 @@ OVS_VSWITCHD_START
+@@ -661,7 +779,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'])
@@ -61905,7 +62110,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +775,7 @@ OVS_VSWITCHD_START
+@@ -676,7 +794,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'])
@@ -61914,7 +62119,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -708,7 +807,7 @@ OVS_VSWITCHD_START
+@@ -708,7 +826,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)'])
@@ -61923,7 +62128,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +822,7 @@ OVS_VSWITCHD_START
+@@ -723,7 +841,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)'])
@@ -61932,7 +62137,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -743,11 +842,11 @@ add_of_ports br0 1
+@@ -743,11 +861,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'])
@@ -61946,7 +62151,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: pop_vlan,2
  ])
-@@ -1011,7 +1110,7 @@ OVS_VSWITCHD_START
+@@ -1011,7 +1129,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)'])
@@ -61955,7 +62160,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([tail -1 stdout], [0],
    [Datapath actions: 10
  ])
-@@ -1142,7 +1241,7 @@ OVS_VSWITCHD_START
+@@ -1142,7 +1260,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)'])
@@ -61964,7 +62169,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +1387,7 @@ table=1 in_port=1 action=dec_ttl,output:3
+@@ -1288,7 +1406,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], [
@@ -61973,7 +62178,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +1410,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:
+@@ -1311,7 +1429,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)
@@ -61982,7 +62187,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1497,13 +1596,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
+@@ -1497,13 +1615,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)
@@ -61999,7 +62204,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -1560,13 +1659,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
+@@ -1560,13 +1678,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)
@@ -62016,7 +62221,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1627,13 +1726,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1627,13 +1745,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)
@@ -62033,7 +62238,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Hit table 0, Miss all other tables, sent to controller
-@@ -1647,13 +1746,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1647,13 +1765,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)
@@ -62050,7 +62255,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1690,13 +1789,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1690,13 +1808,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)
@@ -62067,7 +62272,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Hit table 1, Miss all other tables, sent to controller
-@@ -1710,13 +1809,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1710,13 +1828,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)
@@ -62084,7 +62289,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -1900,13 +1999,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1900,13 +2018,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)
@@ -62101,7 +62306,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Singleton controller action.
-@@ -1920,11 +2019,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1920,11 +2038,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)
@@ -62116,7 +62321,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Modified controller action.
-@@ -1938,13 +2037,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1938,13 +2056,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)
@@ -62133,7 +62338,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Modified VLAN controller action.
-@@ -1958,13 +2057,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -1958,13 +2076,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)
@@ -62150,7 +62355,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Checksum TCP.
-@@ -1978,31 +2077,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1978,31 +2096,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)
@@ -62191,7 +62396,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Checksum UDP.
-@@ -2016,31 +2115,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -2016,31 +2134,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)
@@ -62232,7 +62437,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Modified ARP controller action.
-@@ -2087,31 +2186,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
+@@ -2087,31 +2205,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)
@@ -62273,7 +62478,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
-@@ -2151,13 +2250,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2151,13 +2269,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)
@@ -62290,7 +62495,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -2325,13 +2424,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2325,13 +2443,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)
@@ -62307,7 +62512,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl Modified MPLS controller action.
-@@ -2539,13 +2638,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2539,13 +2657,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)
@@ -62324,7 +62529,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2565,13 +2664,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2565,13 +2683,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)
@@ -62341,7 +62546,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2591,13 +2690,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2591,13 +2709,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)
@@ -62358,7 +62563,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2617,13 +2716,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2617,13 +2735,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)
@@ -62375,7 +62580,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2643,13 +2742,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2643,13 +2761,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)
@@ -62392,7 +62597,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2669,13 +2768,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2669,13 +2787,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)
@@ -62409,7 +62614,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2695,13 +2794,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2695,13 +2813,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)
@@ -62426,7 +62631,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2721,13 +2820,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2721,13 +2839,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)
@@ -62443,7 +62648,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2771,13 +2870,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2771,13 +2889,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)
@@ -62460,7 +62665,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2797,13 +2896,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2797,13 +2915,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)
@@ -62477,7 +62682,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2823,13 +2922,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2823,13 +2941,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)
@@ -62494,7 +62699,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2931,13 +3030,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2931,13 +3049,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)
@@ -62511,7 +62716,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2959,13 +3058,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2959,13 +3077,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)
@@ -62528,7 +62733,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -2986,13 +3085,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -2986,13 +3104,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)
@@ -62545,7 +62750,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3314,13 +3413,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3314,13 +3432,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)
@@ -62562,7 +62767,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3363,13 +3462,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3363,13 +3481,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)
@@ -62579,7 +62784,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3402,13 +3501,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -3402,13 +3520,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)
@@ -62596,7 +62801,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3444,13 +3543,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3444,13 +3562,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)
@@ -62613,7 +62818,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -3516,13 +3615,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2):
+@@ -3516,13 +3634,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)
@@ -62630,7 +62835,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3558,13 +3657,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -3558,13 +3676,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)
@@ -62647,7 +62852,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3607,34 +3706,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3607,34 +3725,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)
@@ -62692,7 +62897,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3679,34 +3778,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
+@@ -3679,34 +3797,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)
@@ -62737,7 +62942,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
-@@ -3751,10 +3850,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl)
+@@ -3751,10 +3869,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)
@@ -62750,7 +62955,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -5007,7 +5106,7 @@ ovs-vsctl \
+@@ -5007,7 +5125,7 @@ ovs-vsctl \
  AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
  
  # "in_port" defaults to OFPP_NONE if it's not specified.
@@ -62759,7 +62964,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
  AT_CHECK_UNQUOTED([tail -1 stdout], [0],
    [Datapath actions: 1,2
-@@ -5317,7 +5416,7 @@ ovs-vsctl \
+@@ -5317,7 +5435,7 @@ ovs-vsctl \
  AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
  
  # "in_port" defaults to OFPP_NONE if it's not specified.
@@ -62768,7 +62973,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +5563,7 @@ ovs-vsctl \
+@@ -5464,7 +5582,7 @@ ovs-vsctl \
  
  flow="in_port=1"
  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
@@ -62777,7 +62982,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -5512,11 +5611,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
+@@ -5512,11 +5630,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])
@@ -62791,7 +62996,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -5573,7 +5672,36 @@ check_flows () {
+@@ -5573,7 +5691,36 @@ check_flows () {
      echo "n_packets=$n"
      test "$n" = 1
  }
@@ -62829,7 +63034,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  
  OVS_VSWITCHD_STOP
  AT_CLEANUP
-@@ -6202,6 +6330,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl
+@@ -6202,6 +6349,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl
  ovs-appctl: ovs-vswitchd: server returned an error
  ])
  
@@ -62850,7 +63055,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -7004,6 +7146,29 @@ AT_CHECK([ovs-appctl coverage/read-counter mac_learning_static_none_move], [0],
+@@ -7004,6 +7165,29 @@ AT_CHECK([ovs-appctl coverage/read-counter mac_learning_static_none_move], [0],
  OVS_VSWITCHD_STOP
  AT_CLEANUP
  
@@ -62880,7 +63085,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  AT_SETUP([ofproto-dpif - basic truncate action])
  OVS_VSWITCHD_START
  add_of_ports br0 1 2 3 4 5
-@@ -7031,7 +7196,7 @@ dnl An 170 byte packet
+@@ -7031,7 +7215,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
@@ -62889,7 +63094,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-appctl revalidator/purge], [0])
-@@ -7600,13 +7765,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the
+@@ -7600,13 +7784,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
@@ -62919,7 +63124,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +8846,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1
+@@ -8666,7 +8865,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
@@ -62928,7 +63133,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP(["/stack underflow/d"])
-@@ -9855,7 +10035,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -9855,7 +10054,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)
@@ -62937,7 +63142,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -9906,7 +10086,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -9906,7 +10105,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)
@@ -62946,7 +63151,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10166,10 +10346,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10166,10 +10365,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)
@@ -62959,7 +63164,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
-@@ -10187,10 +10367,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10187,10 +10386,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)
@@ -62972,7 +63177,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10239,10 +10419,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10239,10 +10438,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)
@@ -62985,7 +63190,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
-@@ -10261,10 +10441,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10261,10 +10460,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)
@@ -62998,7 +63203,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl
-@@ -10320,9 +10500,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -10320,9 +10519,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)
@@ -63010,7 +63215,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10433,7 +10613,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10433,7 +10632,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)
@@ -63019,7 +63224,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  dnl
  OFPT_ECHO_REQUEST (xid=0x0): 0 bytes of payload
  ])
-@@ -10467,7 +10647,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10467,7 +10666,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)
@@ -63028,7 +63233,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10523,16 +10703,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10523,16 +10722,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)
@@ -63049,7 +63254,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10579,10 +10759,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10579,10 +10778,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)
@@ -63062,7 +63267,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10629,10 +10809,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10629,10 +10828,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)
@@ -63075,7 +63280,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10681,19 +10861,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10681,19 +10880,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)
@@ -63100,7 +63305,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -10738,10 +10918,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -10738,10 +10937,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)
@@ -63113,7 +63318,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  OVS_VSWITCHD_STOP
-@@ -11152,16 +11332,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This
+@@ -11152,16 +11351,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)
@@ -63134,7 +63339,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644
  ])
  
  dnl The next test verifies that ct_clear at the datapath only gets executed
-@@ -11235,13 +11415,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
+@@ -11235,13 +11434,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)
@@ -63579,10 +63784,258 @@ 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
+index 62e2b63832..092d9f81a2 100644
 --- a/tests/ovsdb-idl.at
 +++ b/tests/ovsdb-idl.at
-@@ -2437,3 +2437,92 @@ unix:socket2 remote has col id in table simple7
+@@ -561,9 +561,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, false condition],
+                "b": true}}]']],
+   [['condition simple []' \
+     'condition simple [true]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 004: done
+ ]])
+@@ -577,13 +577,40 @@ OVSDB_CHECK_IDL([simple idl, conditional, true condition],
+                "b": true}}]']],
+   [['condition simple []' \
+     'condition simple [true]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 004: done
+ ]])
+ 
++dnl This test ensures that the first explicitly set monitor condition
++dnl is sent to the server.
++OVSDB_CHECK_IDL([simple idl, conditional, wait for condition],
++  [],
++  [['["idltest",
++       {"op": "insert",
++       "table": "simple",
++       "row": {"i": 1,
++               "r": 2.0,
++               "b": true}}]' \
++     'condition simple [true]' \
++     '^["idltest",
++       {"op": "insert",
++       "table": "simple",
++       "row": {"i": 2,
++               "r": 4.0,
++               "b": true}}]']],
++  [[000: empty
++001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]}
++002: table simple: i=1 r=2 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0>
++003: simple: conditions unchanged
++004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]}
++005: table simple: i=1 r=2 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0>
++005: table simple: i=2 r=4 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
++006: done
++]])
++
+ OVSDB_CHECK_IDL([simple idl, conditional, multiple clauses in condition],
+   [['["idltest",
+        {"op": "insert",
+@@ -598,9 +625,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, multiple clauses in condition],
+                "b": true}}]']],
+   [['condition simple []' \
+     'condition simple [["i","==",1],["i","==",2]]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 003: table simple: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
+ 004: done
+@@ -615,9 +642,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, modify as insert due to condition],
+                "b": true}}]']],
+   [['condition simple []' \
+     'condition simple [["i","==",1]]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 004: done
+ ]])
+@@ -638,11 +665,11 @@ OVSDB_CHECK_IDL([simple idl, conditional, modify as delete due to condition],
+        "row": {"i": 2,
+                "r": 3.0,
+                "b": true}}]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+-004: change conditions
++004: simple: change conditions
+ 005: empty
+ 006: {"error":null,"result":[{"uuid":["uuid","<2>"]}]}
+ 007: table simple: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
+@@ -673,14 +700,16 @@ OVSDB_CHECK_IDL([simple idl, conditional, multiple tables],
+        "table": "link2",
+        "row": {"i": 3},
+         "uuid-name": "row0"}]']],
+-  [[000: change conditions
++  [[000: link1: change conditions
++000: link2: change conditions
++000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+-004: change conditions
++004: link1: change conditions
+ 005: table link1: i=0 k=0 ka=[] l2= uuid=<2>
+ 005: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+-006: change conditions
++006: link2: change conditions
+ 007: {"error":null,"result":[{"uuid":["uuid","<3>"]}]}
+ 008: table link1: i=0 k=0 ka=[] l2= uuid=<2>
+ 008: table link2: i=3 l1= uuid=<3>
+@@ -1237,10 +1266,10 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan weak refer
+       {"op": "delete",
+       "table": "simple6",
+       "where": []}]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0>
+ 001: table simple6: updated columns: name weak_ref
+-002: change conditions
++002: simple: change conditions
+ 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0>
+ 003: table simple: inserted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 003: table simple: updated columns: s
+@@ -1279,19 +1308,19 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan rows, cond
+       {"op": "delete",
+       "table": "simple6",
+       "where": []}]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0>
+ 001: table simple6: updated columns: name weak_ref
+-002: change conditions
++002: simple: change conditions
+ 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0>
+ 003: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 003: table simple: updated columns: s
+-004: change conditions
++004: simple: change conditions
+ 005: table simple6: name=first_row weak_ref=[] uuid=<0>
+ 005: table simple: deleted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 005: table simple: inserted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
+ 005: table simple: updated columns: s
+-006: change conditions
++006: simple: change conditions
+ 007: table simple6: name=first_row weak_ref=[<1>] uuid=<0>
+ 007: table simple: deleted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
+ 007: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+@@ -1333,14 +1362,14 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, condi
+       {"op": "delete",
+       "table": "simple6",
+       "where": []}]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0>
+ 001: table simple6: updated columns: name weak_ref
+-002: change conditions
++002: simple: change conditions
+ 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0>
+ 003: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 003: table simple: updated columns: s
+-004: change conditions
++004: simple: change conditions
+ 005: table simple6: name=first_row weak_ref=[<3>] uuid=<0>
+ 005: table simple: deleted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+ 005: table simple: inserted row: i=1 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
+@@ -1376,7 +1405,8 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, singl
+       {"op": "insert",
+        "table": "simple",
+        "row": {"s": "row0_s"}}]']],
+-  [[000: change conditions
++  [[000: simple6: conditions unchanged
++000: simple: conditions unchanged
+ 001: table simple6: inserted row: name=row0_s6 weak_ref=[<0>] uuid=<1>
+ 001: table simple6: updated columns: name weak_ref
+ 001: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0>
+@@ -1418,7 +1448,8 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, weak references,
+       {"op": "insert",
+        "table": "simple",
+        "row": {"s": "row0_s"}}]']],
+-  [[000: change conditions
++  [[000: simple6: conditions unchanged
++000: simple: conditions unchanged
+ 001: table simple6: inserted row: name=row0_s6 weak_ref=[<0>] uuid=<1>
+ 001: table simple6: updated columns: name weak_ref
+ 001: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0>
+@@ -1458,7 +1489,9 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, strong references
+       {"op": "insert",
+        "table": "simple",
+        "row": {"s": "row0_s"}}]']],
+-  [[000: change conditions
++  [[000: simple3: conditions unchanged
++000: simple4: conditions unchanged
++000: simple: conditions unchanged
+ 001: table simple3: inserted row: name=row0_s3 uset=[] uref=[<0>] uuid=<1>
+ 001: table simple3: updated columns: name uref
+ 001: table simple4: inserted row: name=row0_s4 uuid=<0>
+@@ -1493,12 +1526,14 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, strong references
+       {"op": "insert",
+        "table": "simple",
+        "row": {"s": "row0_s"}}]']],
+-  [[000: change conditions
++  [[000: simple3: conditions unchanged
++000: simple4: conditions unchanged
++000: simple: conditions unchanged
+ 001: table simple3: inserted row: name=row0_s3 uset=[] uref=[<0>] uuid=<1>
+ 001: table simple3: updated columns: name uref
+ 001: table simple4: inserted row: name=row0_s4 uuid=<0>
+ 001: table simple4: updated columns: name
+-002: change conditions
++002: simple4: change conditions
+ 003: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1>
+ 003: table simple4: deleted row: name=row0_s4 uuid=<0>
+ 004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]}
+@@ -1529,10 +1564,12 @@ OVSDB_CHECK_IDL([simple idl, initially populated, strong references, conditional
+       {"op": "insert",
+        "table": "simple",
+        "row": {"s": "row0_s"}}]']],
+-  [[000: change conditions
++  [[000: simple3: conditions unchanged
++000: simple4: conditions unchanged
++000: simple: conditions unchanged
+ 001: table simple3: name=row0_s3 uset=[] uref=[<0>] uuid=<1>
+ 001: table simple4: name=row0_s4 uuid=<0>
+-002: change conditions
++002: simple4: change conditions
+ 003: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1>
+ 004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]}
+ 005: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1>
+@@ -2341,11 +2378,11 @@ OVSDB_CHECK_CLUSTER_IDL([simple idl, monitor_cond_since, cluster disconnect],
+        "table": "simple",
+        "where": [["i", "==", 1]],
+        "row": {"r": 2.0 }}]']],
+-  [[000: change conditions
++  [[000: simple: change conditions
+ 001: empty
+-002: change conditions
++002: simple: change conditions
+ 003: table simple: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
+-004: change conditions
++004: simple: change conditions
+ 005: reconnect
+ 006: table simple
+ 007: {"error":null,"result":[{"count":1}]}
+@@ -2437,3 +2474,92 @@ unix:socket2 remote has col id in table simple7
  
  OVSDB_SERVER_SHUTDOWN
  AT_CLEANUP
@@ -65839,7 +66292,7 @@ index 6f1fb059bc..ac82f2048e 100644
      }
  }
 diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
-index ca4e87b811..c7bc32a246 100644
+index ca4e87b811..e725cd4983 100644
 --- a/tests/test-ovsdb.c
 +++ b/tests/test-ovsdb.c
 @@ -294,11 +294,24 @@ print_and_free_ovsdb_error(struct ovsdb_error *error)
@@ -66103,11 +66556,107 @@ index ca4e87b811..c7bc32a246 100644
  
      if (terse) {
          return xasprintf("%03d: table %s", step, row->table->class_->name);
+@@ -2541,11 +2605,12 @@ parse_link2_json_clause(struct ovsdb_idl_condition *cond,
+     }
+ }
+ 
+-static void
+-update_conditions(struct ovsdb_idl *idl, char *commands)
++static unsigned int
++update_conditions(struct ovsdb_idl *idl, char *commands, int step)
+ {
+-    char *cmd, *save_ptr1 = NULL;
+     const struct ovsdb_idl_table_class *tc;
++    unsigned int next_cond_seqno = 0;
++    char *cmd, *save_ptr1 = NULL;
+ 
+     for (cmd = strtok_r(commands, ";", &save_ptr1); cmd;
+          cmd = strtok_r(NULL, ";", &save_ptr1)) {
+@@ -2596,15 +2661,20 @@ update_conditions(struct ovsdb_idl *idl, char *commands)
+         unsigned int seqno = ovsdb_idl_get_condition_seqno(idl);
+         unsigned int next_seqno = ovsdb_idl_set_condition(idl, tc, &cond);
+         if (seqno == next_seqno ) {
+-            ovs_fatal(0, "condition unchanged");
++            print_and_log("%03d: %s: conditions unchanged",
++                          step, table_name);
++        } else {
++            print_and_log("%03d: %s: change conditions", step, table_name);
+         }
+         unsigned int new_next_seqno = ovsdb_idl_set_condition(idl, tc, &cond);
+         if (next_seqno != new_next_seqno) {
+             ovs_fatal(0, "condition expected seqno changed");
+         }
++        next_cond_seqno = MAX(next_cond_seqno, next_seqno);
+         ovsdb_idl_condition_destroy(&cond);
+         json_destroy(json);
+     }
++    return next_cond_seqno;
+ }
+ 
+ static void
+@@ -2612,6 +2682,7 @@ do_idl(struct ovs_cmdl_context *ctx)
+ {
+     struct jsonrpc *rpc;
+     struct ovsdb_idl *idl;
++    unsigned int next_cond_seqno = 0;
+     unsigned int seqno = 0;
+     struct ovsdb_symbol_table *symtab;
+     size_t n_uuids = 0;
+@@ -2647,8 +2718,8 @@ do_idl(struct ovs_cmdl_context *ctx)
+     const char remote_s[] = "set-remote ";
+     const char cond_s[] = "condition ";
+     if (ctx->argc > 2 && strstr(ctx->argv[2], cond_s)) {
+-        update_conditions(idl, ctx->argv[2] + strlen(cond_s));
+-        print_and_log("%03d: change conditions", step++);
++        next_cond_seqno =
++            update_conditions(idl, ctx->argv[2] + strlen(cond_s), step++);
+         i = 3;
+     } else {
+         i = 2;
+@@ -2667,6 +2738,21 @@ do_idl(struct ovs_cmdl_context *ctx)
+         if (*arg == '+') {
+             /* The previous transaction didn't change anything. */
+             arg++;
++        } else if (*arg == '^') {
++            /* Wait for condition change to be acked by the server. */
++            arg++;
++            for (;;) {
++                ovsdb_idl_run(idl);
++                ovsdb_idl_check_consistency(idl);
++                if (ovsdb_idl_get_condition_seqno(idl) == next_cond_seqno) {
++                    break;
++                }
++                jsonrpc_run(rpc);
++
++                ovsdb_idl_wait(idl);
++                jsonrpc_wait(rpc);
++                poll_block();
++            }
+         } else {
+             /* Wait for update. */
+             for (;;) {
+@@ -2701,8 +2787,8 @@ do_idl(struct ovs_cmdl_context *ctx)
+                           arg + strlen(remote_s),
+                           ovsdb_idl_is_connected(idl) ? "true" : "false");
+         }  else if (!strncmp(arg, cond_s, strlen(cond_s))) {
+-            update_conditions(idl, arg + strlen(cond_s));
+-            print_and_log("%03d: change conditions", step++);
++            next_cond_seqno = update_conditions(idl, arg + strlen(cond_s),
++                                                step++);
+         } else if (arg[0] != '[') {
+             idl_set(idl, arg, step++);
+         } else {
 diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py
-index 853264f22b..402cacbe9d 100644
+index 853264f22b..eded9140e4 100644
 --- a/tests/test-ovsdb.py
 +++ b/tests/test-ovsdb.py
-@@ -620,7 +620,7 @@ def update_condition(idl, commands):
+@@ -616,18 +616,32 @@ def idl_set(idl, commands, step):
+     sys.stdout.flush()
+ 
+ 
+-def update_condition(idl, commands):
++def update_condition(idl, commands, step):
++    next_cond_seqno = 0
      commands = commands[len("condition "):].split(";")
      for command in commands:
          command = command.split(" ")
@@ -66116,6 +66665,74 @@ index 853264f22b..402cacbe9d 100644
              sys.stderr.write("Error parsing condition %s\n" % command)
              sys.exit(1)
  
+         table = command[0]
+         cond = ovs.json.from_string(command[1])
+ 
+-        idl.cond_change(table, cond)
++        next_seqno = idl.cond_change(table, cond)
++        if idl.cond_seqno == next_seqno:
++            sys.stdout.write("%03d: %s: conditions unchanged\n" %
++                             (step, table))
++        else:
++            sys.stdout.write("%03d: %s: change conditions\n" %
++                             (step, table))
++        sys.stdout.flush()
++
++        assert next_seqno == idl.cond_change(table, cond), \
++            "condition expected seqno changed"
++        next_cond_seqno = max(next_cond_seqno, next_seqno)
++
++    return next_cond_seqno
+ 
+ 
+ def do_idl(schema_file, remote, *commands):
+@@ -684,6 +698,7 @@ def do_idl(schema_file, remote, *commands):
+     else:
+         rpc = None
+ 
++    next_cond_seqno = 0
+     symtab = {}
+     seqno = 0
+     step = 0
+@@ -707,9 +722,7 @@ def do_idl(schema_file, remote, *commands):
+ 
+     commands = list(commands)
+     if len(commands) >= 1 and "condition" in commands[0]:
+-        update_condition(idl, commands.pop(0))
+-        sys.stdout.write("%03d: change conditions\n" % step)
+-        sys.stdout.flush()
++        next_cond_seqno = update_condition(idl, commands.pop(0), step)
+         step += 1
+ 
+     for command in commands:
+@@ -722,6 +735,16 @@ def do_idl(schema_file, remote, *commands):
+         if command.startswith("+"):
+             # The previous transaction didn't change anything.
+             command = command[1:]
++        elif command.startswith("^"):
++            # Wait for condition change to be acked by the server.
++            command = command[1:]
++            while idl.cond_seqno != next_cond_seqno and not idl.run():
++                rpc.run()
++
++                poller = ovs.poller.Poller()
++                idl.wait(poller)
++                rpc.wait(poller)
++                poller.block()
+         else:
+             # Wait for update.
+             while idl.change_seqno == seqno and not idl.run():
+@@ -743,9 +766,7 @@ def do_idl(schema_file, remote, *commands):
+             step += 1
+             idl.force_reconnect()
+         elif "condition" in command:
+-            update_condition(idl, command)
+-            sys.stdout.write("%03d: change conditions\n" % step)
+-            sys.stdout.flush()
++            next_cond_seqno = update_condition(idl, command, step)
+             step += 1
+         elif not command.startswith("["):
+             idl_set(idl, command, step)
 diff --git a/tests/test-rcu.c b/tests/test-rcu.c
 index 965f3c49f3..bb17092bf0 100644
 --- a/tests/test-rcu.c
@@ -66415,6 +67032,23 @@ index 62928d50fc..763ece2a78 100644
 diff --git a/utilities/ovs-appctl-bashcomp.bash b/utilities/ovs-appctl-bashcomp.bash
 old mode 100755
 new mode 100644
+diff --git a/utilities/ovs-dpctl-top.in b/utilities/ovs-dpctl-top.in
+index fbe6e4f560..2c1766eff5 100755
+--- a/utilities/ovs-dpctl-top.in
++++ b/utilities/ovs-dpctl-top.in
+@@ -1236,11 +1236,7 @@ def flows_script(args):
+ 
+     if (args.flowFiles is None):
+         logging.info("reading flows from stdin")
+-        ihdl = os.fdopen(sys.stdin.fileno(), 'r', 0)
+-        try:
+-            flow_db = flows_read(ihdl, flow_db)
+-        finally:
+-            ihdl.close()
++        flow_db = flows_read(sys.stdin, flow_db)
+     else:
+         for flowFile in args.flowFiles:
+             logging.info("reading flows from %s", flowFile)
 diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
 index ede7f1e61a..6771973ae9 100644
 --- a/utilities/ovs-ofctl.c
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index 03996d2..4423ca1 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: 65%{?dist}
+Release: 68%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -743,6 +743,55 @@ exit 0
 %endif
 
 %changelog
+* Wed Jan 04 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-68
+- Merging upstream branch-2.17 [RH git: ba8ea0794a]
+    Commit list:
+    8d055809b8 ci: Fix overriding OPTS provided from the yml.
+    0eb2aa46be Prepare for 2.17.6.
+    08971e4b93 Set release date for 2.17.5.
+    ecaacb01a9 lldp: Fix bugs when parsing malformed AutoAttach.
+    ee002b3514 dpif-netdev: Use unmasked key when adding datapath flows.
+    18dcfda673 ovsdb-cs: Consider default conditions implicitly acked.
+    793709a856 rculist: Use rculist_back_protected to access prev.
+    abb9d3482e Prepare for 2.17.5.
+    b6c3788fe2 Set release date for 2.17.4.
+    b50f4e3d21 odp-util: Fix reporting unknown keys as keys with bad length.
+    44012fccdc ovs-dpctl-top: Fix ovs-dpctl-top via pipe.
+
+
+* Tue Dec 06 2022 Timothy Redaelli <tredaelli@redhat.com> - 2.17.0-67
+- net/i40e: fix jumbo frame Rx with X722 [RH git: c34d3981fc]
+    [ upstream commit 719469f13b11dbdc921b74258f2d10bd1c5328d4 ]
+    
+    For NIC I40E_10G-10G_BASE_T_X722, when the port is configured with
+    link speed, it cannot receive jumbo frame packets.
+    
+    Because it set maximum frame size failed when starts the port that
+    the port link status is still down.
+    
+    This patch fix the error that starts the port will force set maximum
+    frame size.
+    
+    Fixes: 2184f7cdeeaa ("net/i40e: fix max frame size config at port level")
+    
+    Signed-off-by: Jie Wang <jie1x.wang@intel.com>
+    Tested-by: Dukai Yuan <dukaix.yuan@intel.com>
+
+
+* Fri Nov 25 2022 Timothy Redaelli <tredaelli@redhat.com> - 2.17.0-66
+- vhost: fix virtqueue use after free on NUMA reallocation [RH git: f4948cf20a]
+    [ upstream commit 0b2a2ca35037d6a5168f0832c11d9858b8ae946a ]
+    
+    translate_ring_addresses (via numa_realloc) may change a virtio device and
+    virtio queue.
+    The virtqueue object must be refreshed before accessing the lock.
+    
+    Fixes: 04c27cb673b9 ("vhost: fix unsafe vring addresses modifications")
+    
+    Signed-off-by: David Marchand <david.marchand@redhat.com>
+    Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
+
+
 * Thu Nov 24 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-65
 - Merging upstream branch-2.17 [RH git: 63d511698e]
     Commit list: