Open vSwitch CI fe1a04
diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
Open vSwitch CI fe1a04
index 3e5136fd4e..dd29a4182d 100755
Open vSwitch CI fe1a04
--- a/.ci/linux-build.sh
Open vSwitch CI fe1a04
+++ b/.ci/linux-build.sh
Open vSwitch CI fe1a04
@@ -235,7 +235,7 @@ if [ "$TESTSUITE" ]; then
Open vSwitch CI fe1a04
     configure_ovs
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     export DISTCHECK_CONFIGURE_FLAGS="$OPTS"
Open vSwitch CI fe1a04
-    if ! make distcheck CFLAGS="${CFLAGS_FOR_OVS}" \
Open vSwitch CI fe1a04
+    if ! make distcheck -j4 CFLAGS="${CFLAGS_FOR_OVS}" \
Open vSwitch CI fe1a04
          TESTSUITEFLAGS=-j4 RECHECK=yes; then
Open vSwitch CI fe1a04
         # testsuite.log is necessary for debugging.
Open vSwitch CI fe1a04
         cat */_build/sub/tests/testsuite.log
Open vSwitch CI daaf06
diff --git a/Documentation/topics/dpdk/pmd.rst b/Documentation/topics/dpdk/pmd.rst
Open vSwitch CI daaf06
index caa7d97bef..e481e79414 100644
Open vSwitch CI daaf06
--- a/Documentation/topics/dpdk/pmd.rst
Open vSwitch CI daaf06
+++ b/Documentation/topics/dpdk/pmd.rst
Open vSwitch CI daaf06
@@ -239,7 +239,9 @@ If not set, the default variance improvement threshold is 25%.
Open vSwitch CI daaf06
 
Open vSwitch CI daaf06
     PMD Auto Load Balancing doesn't currently work if queues are assigned
Open vSwitch CI daaf06
     cross NUMA as actual processing load could get worse after assignment
Open vSwitch CI daaf06
-    as compared to what dry run predicts.
Open vSwitch CI daaf06
+    as compared to what dry run predicts. The only exception is when all
Open vSwitch CI daaf06
+    PMD threads are running on cores from a single NUMA node.  In this case
Open vSwitch CI daaf06
+    Auto Load Balancing is still possible.
Open vSwitch CI daaf06
 
Open vSwitch CI daaf06
 The minimum time between 2 consecutive PMD auto load balancing iterations can
Open vSwitch CI daaf06
 also be configured by::
Open vSwitch CI fe1a04
diff --git a/Documentation/topics/dpdk/qos.rst b/Documentation/topics/dpdk/qos.rst
Open vSwitch CI fe1a04
index 103495415a..a98ec672fc 100644
Open vSwitch CI fe1a04
--- a/Documentation/topics/dpdk/qos.rst
Open vSwitch CI fe1a04
+++ b/Documentation/topics/dpdk/qos.rst
Open vSwitch CI fe1a04
@@ -69,22 +69,24 @@ to prioritize certain traffic over others at a port level.
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 For example, the following configuration will limit the traffic rate at a
Open vSwitch CI fe1a04
 port level to a maximum of 2000 packets a second (64 bytes IPv4 packets).
Open vSwitch CI fe1a04
-100pps as CIR (Committed Information Rate) and 1000pps as EIR (Excess
Open vSwitch CI fe1a04
-Information Rate). High priority traffic is routed to queue 10, which marks
Open vSwitch CI fe1a04
+1000pps as CIR (Committed Information Rate) and 1000pps as EIR (Excess
Open vSwitch CI fe1a04
+Information Rate). CIR and EIR are measured in bytes without Ethernet header.
Open vSwitch CI fe1a04
+As a result, 1000pps means (64-byte - 14-byte) * 1000 = 50,000 in the
Open vSwitch CI fe1a04
+configuration below. High priority traffic is routed to queue 10, which marks
Open vSwitch CI fe1a04
 all traffic as CIR, i.e. Green. All low priority traffic, queue 20, is
Open vSwitch CI fe1a04
 marked as EIR, i.e. Yellow::
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     $ ovs-vsctl --timeout=5 set port dpdk1 qos=@myqos -- \
Open vSwitch CI fe1a04
         --id=@myqos create qos type=trtcm-policer \
Open vSwitch CI fe1a04
-        other-config:cir=52000 other-config:cbs=2048 \
Open vSwitch CI fe1a04
-        other-config:eir=52000 other-config:ebs=2048  \
Open vSwitch CI fe1a04
+        other-config:cir=50000 other-config:cbs=2048 \
Open vSwitch CI fe1a04
+        other-config:eir=50000 other-config:ebs=2048  \
Open vSwitch CI fe1a04
         queues:10=@dpdk1Q10 queues:20=@dpdk1Q20 -- \
Open vSwitch CI fe1a04
          --id=@dpdk1Q10 create queue \
Open vSwitch CI fe1a04
-          other-config:cir=41600000 other-config:cbs=2048 \
Open vSwitch CI fe1a04
+          other-config:cir=100000 other-config:cbs=2048 \
Open vSwitch CI fe1a04
           other-config:eir=0 other-config:ebs=0 -- \
Open vSwitch CI fe1a04
          --id=@dpdk1Q20 create queue \
Open vSwitch CI fe1a04
            other-config:cir=0 other-config:cbs=0 \
Open vSwitch CI fe1a04
-           other-config:eir=41600000 other-config:ebs=2048 \
Open vSwitch CI fe1a04
+           other-config:eir=50000 other-config:ebs=2048
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 This configuration accomplishes that the high priority traffic has a
Open vSwitch CI fe1a04
 guaranteed bandwidth egressing the ports at CIR (1000pps), but it can also
Open vSwitch CI fe1a04
diff --git a/NEWS b/NEWS
Open vSwitch CI fe1a04
index bc901efdb1..036d4032c4 100644
Open vSwitch CI fe1a04
--- a/NEWS
Open vSwitch CI fe1a04
+++ b/NEWS
Open vSwitch CI fe1a04
@@ -1,3 +1,11 @@
Open vSwitch CI fe1a04
+v2.15.1 - xx xxx xxxx
Open vSwitch CI fe1a04
+---------------------
Open vSwitch CI fe1a04
+   - ovs-ctl:
Open vSwitch CI fe1a04
+     * New option '--no-record-hostname' to disable hostname configuration
Open vSwitch CI fe1a04
+       in ovsdb on startup.
Open vSwitch CI fe1a04
+     * New command 'record-hostname-if-not-set' to update hostname in ovsdb.
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 v2.15.0 - 15 Feb 2021
Open vSwitch CI fe1a04
 ---------------------
Open vSwitch CI fe1a04
    - OVSDB:
Open vSwitch CI fe1a04
diff --git a/configure.ac b/configure.ac
Open vSwitch CI fe1a04
index fd82d7d270..9299342960 100644
Open vSwitch CI fe1a04
--- a/configure.ac
Open vSwitch CI fe1a04
+++ b/configure.ac
Open vSwitch CI fe1a04
@@ -13,7 +13,7 @@
Open vSwitch CI fe1a04
 # limitations under the License.
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 AC_PREREQ(2.63)
Open vSwitch CI fe1a04
-AC_INIT(openvswitch, 2.15.0, bugs@openvswitch.org)
Open vSwitch CI fe1a04
+AC_INIT(openvswitch, 2.15.1, bugs@openvswitch.org)
Open vSwitch CI fe1a04
 AC_CONFIG_SRCDIR([datapath/datapath.c])
Open vSwitch CI fe1a04
 AC_CONFIG_MACRO_DIR([m4])
Open vSwitch CI fe1a04
 AC_CONFIG_AUX_DIR([build-aux])
Open vSwitch CI fe1a04
diff --git a/debian/changelog b/debian/changelog
Open vSwitch CI fe1a04
index 1f2b7a3668..8b5d075840 100644
Open vSwitch CI fe1a04
--- a/debian/changelog
Open vSwitch CI fe1a04
+++ b/debian/changelog
Open vSwitch CI fe1a04
@@ -1,3 +1,9 @@
Open vSwitch CI fe1a04
+openvswitch (2.15.1-1) unstable; urgency=low
Open vSwitch CI fe1a04
+   [ Open vSwitch team ]
Open vSwitch CI fe1a04
+   * New upstream version
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+ -- Open vSwitch team <dev@openvswitch.org>  Mon, 15 Feb 2021 17:35:33 +0100
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 openvswitch (2.15.0-1) unstable; urgency=low
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
    * New upstream version
Open vSwitch CI fe1a04
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
Open vSwitch CI 0aa018
index 4381c618f1..251788b049 100644
Open vSwitch CI fe1a04
--- a/lib/dpif-netdev.c
Open vSwitch CI fe1a04
+++ b/lib/dpif-netdev.c
Open vSwitch CI 0aa018
@@ -279,8 +279,9 @@ static bool dpcls_lookup(struct dpcls *cls,
Open vSwitch CI 0aa018
     ( 1 << OFPMBT13_DROP )
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 struct dp_meter_band {
Open vSwitch CI 0aa018
-    struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */
Open vSwitch CI 0aa018
-    uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
Open vSwitch CI 0aa018
+    uint32_t rate;
Open vSwitch CI 0aa018
+    uint32_t burst_size;
Open vSwitch CI 0aa018
+    uint64_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
Open vSwitch CI 0aa018
     uint64_t packet_count;
Open vSwitch CI 0aa018
     uint64_t byte_count;
Open vSwitch CI 0aa018
 };
Open vSwitch CI 0aa018
@@ -3834,6 +3835,15 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
Open vSwitch CI fe1a04
         return error;
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+    if (match.wc.masks.in_port.odp_port != ODPP_NONE) {
Open vSwitch CI fe1a04
+        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+        VLOG_ERR_RL(&rl, "failed to put%s flow: in_port is not an exact match",
Open vSwitch CI fe1a04
+                    (put->flags & DPIF_FP_CREATE) ? "[create]"
Open vSwitch CI fe1a04
+                    : (put->flags & DPIF_FP_MODIFY) ? "[modify]" : "[zero]");
Open vSwitch CI fe1a04
+        return EINVAL;
Open vSwitch CI fe1a04
+    }
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
     if (put->ufid) {
Open vSwitch CI fe1a04
         ufid = *put->ufid;
Open vSwitch CI fe1a04
     } else {
Open vSwitch CI 0aa018
@@ -4878,6 +4888,12 @@ struct rr_numa {
Open vSwitch CI daaf06
     bool idx_inc;
Open vSwitch CI daaf06
 };
Open vSwitch CI daaf06
 
Open vSwitch CI daaf06
+static size_t
Open vSwitch CI daaf06
+rr_numa_list_count(struct rr_numa_list *rr)
Open vSwitch CI daaf06
+{
Open vSwitch CI daaf06
+    return hmap_count(&rr->numas);
Open vSwitch CI daaf06
+}
Open vSwitch CI daaf06
+
Open vSwitch CI daaf06
 static struct rr_numa *
Open vSwitch CI daaf06
 rr_numa_list_lookup(struct rr_numa_list *rr, int numa_id)
Open vSwitch CI daaf06
 {
Open vSwitch CI 0aa018
@@ -5590,10 +5606,17 @@ get_dry_run_variance(struct dp_netdev *dp, uint32_t *core_list,
Open vSwitch CI daaf06
     for (int i = 0; i < n_rxqs; i++) {
Open vSwitch CI daaf06
         int numa_id = netdev_get_numa_id(rxqs[i]->port->netdev);
Open vSwitch CI daaf06
         numa = rr_numa_list_lookup(&rr, numa_id);
Open vSwitch CI daaf06
+        /* If there is no available pmd on the local numa but there is only one
Open vSwitch CI daaf06
+         * numa for cross-numa polling, we can estimate the dry run. */
Open vSwitch CI daaf06
+        if (!numa && rr_numa_list_count(&rr) == 1) {
Open vSwitch CI daaf06
+            numa = rr_numa_list_next(&rr, NULL);
Open vSwitch CI daaf06
+        }
Open vSwitch CI daaf06
         if (!numa) {
Open vSwitch CI daaf06
-            /* Abort if cross NUMA polling. */
Open vSwitch CI daaf06
-            VLOG_DBG("PMD auto lb dry run."
Open vSwitch CI daaf06
-                     " Aborting due to cross-numa polling.");
Open vSwitch CI daaf06
+            VLOG_DBG("PMD auto lb dry run: "
Open vSwitch CI daaf06
+                     "There's no available (non-isolated) PMD thread on NUMA "
Open vSwitch CI daaf06
+                     "node %d for port '%s' and there are PMD threads on more "
Open vSwitch CI daaf06
+                     "than one NUMA node available for cross-NUMA polling. "
Open vSwitch CI daaf06
+                     "Aborting.", numa_id, netdev_rxq_get_name(rxqs[i]->rx));
Open vSwitch CI daaf06
             goto cleanup;
Open vSwitch CI daaf06
         }
Open vSwitch CI daaf06
 
Open vSwitch CI 0aa018
@@ -6203,12 +6226,14 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_,
Open vSwitch CI 0aa018
     /* Update all bands and find the one hit with the highest rate for each
Open vSwitch CI 0aa018
      * packet (if any). */
Open vSwitch CI 0aa018
     for (int m = 0; m < meter->n_bands; ++m) {
Open vSwitch CI 0aa018
-        band = &meter->bands[m];
Open vSwitch CI 0aa018
+        uint64_t max_bucket_size;
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
+        band = &meter->bands[m];
Open vSwitch CI 0aa018
+        max_bucket_size = (band->rate + band->burst_size) * 1000ULL;
Open vSwitch CI 0aa018
         /* Update band's bucket. */
Open vSwitch CI 0aa018
-        band->bucket += delta_t * band->up.rate;
Open vSwitch CI 0aa018
-        if (band->bucket > band->up.burst_size) {
Open vSwitch CI 0aa018
-            band->bucket = band->up.burst_size;
Open vSwitch CI 0aa018
+        band->bucket += (uint64_t) delta_t * band->rate;
Open vSwitch CI 0aa018
+        if (band->bucket > max_bucket_size) {
Open vSwitch CI 0aa018
+            band->bucket = max_bucket_size;
Open vSwitch CI 0aa018
         }
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
         /* Drain the bucket for all the packets, if possible. */
Open vSwitch CI 0aa018
@@ -6226,8 +6251,8 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_,
Open vSwitch CI 0aa018
                  * (Only one band will be fired by a packet, and that
Open vSwitch CI 0aa018
                  * can be different for each packet.) */
Open vSwitch CI 0aa018
                 for (int i = band_exceeded_pkt; i < cnt; i++) {
Open vSwitch CI 0aa018
-                    if (band->up.rate > exceeded_rate[i]) {
Open vSwitch CI 0aa018
-                        exceeded_rate[i] = band->up.rate;
Open vSwitch CI 0aa018
+                    if (band->rate > exceeded_rate[i]) {
Open vSwitch CI 0aa018
+                        exceeded_rate[i] = band->rate;
Open vSwitch CI 0aa018
                         exceeded_band[i] = m;
Open vSwitch CI 0aa018
                     }
Open vSwitch CI 0aa018
                 }
Open vSwitch CI 0aa018
@@ -6246,8 +6271,8 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_,
Open vSwitch CI 0aa018
                         /* Update the exceeding band for the exceeding packet.
Open vSwitch CI 0aa018
                          * (Only one band will be fired by a packet, and that
Open vSwitch CI 0aa018
                          * can be different for each packet.) */
Open vSwitch CI 0aa018
-                        if (band->up.rate > exceeded_rate[i]) {
Open vSwitch CI 0aa018
-                            exceeded_rate[i] = band->up.rate;
Open vSwitch CI 0aa018
+                        if (band->rate > exceeded_rate[i]) {
Open vSwitch CI 0aa018
+                            exceeded_rate[i] = band->rate;
Open vSwitch CI 0aa018
                             exceeded_band[i] = m;
Open vSwitch CI 0aa018
                         }
Open vSwitch CI 0aa018
                     }
Open vSwitch CI 0aa018
@@ -6329,16 +6354,15 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id meter_id,
Open vSwitch CI 0aa018
             config->bands[i].burst_size = config->bands[i].rate;
Open vSwitch CI 0aa018
         }
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
-        meter->bands[i].up = config->bands[i];
Open vSwitch CI 0aa018
-        /* Convert burst size to the bucket units: */
Open vSwitch CI 0aa018
-        /* pkts => 1/1000 packets, kilobits => bits. */
Open vSwitch CI 0aa018
-        meter->bands[i].up.burst_size *= 1000;
Open vSwitch CI 0aa018
-        /* Initialize bucket to empty. */
Open vSwitch CI 0aa018
-        meter->bands[i].bucket = 0;
Open vSwitch CI 0aa018
+        meter->bands[i].rate = config->bands[i].rate;
Open vSwitch CI 0aa018
+        meter->bands[i].burst_size = config->bands[i].burst_size;
Open vSwitch CI 0aa018
+        /* Start with a full bucket. */
Open vSwitch CI 0aa018
+        meter->bands[i].bucket =
Open vSwitch CI 0aa018
+            (meter->bands[i].burst_size + meter->bands[i].rate) * 1000ULL;
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
         /* Figure out max delta_t that is enough to fill any bucket. */
Open vSwitch CI 0aa018
         band_max_delta_t
Open vSwitch CI 0aa018
-            = meter->bands[i].up.burst_size / meter->bands[i].up.rate;
Open vSwitch CI 0aa018
+            = meter->bands[i].bucket / meter->bands[i].rate;
Open vSwitch CI 0aa018
         if (band_max_delta_t > meter->max_delta_t) {
Open vSwitch CI 0aa018
             meter->max_delta_t = band_max_delta_t;
Open vSwitch CI 0aa018
         }
Open vSwitch CI fe1a04
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
Open vSwitch CI fe1a04
index 6be23dbeed..15b25084b3 100644
Open vSwitch CI fe1a04
--- a/lib/netdev-linux.c
Open vSwitch CI fe1a04
+++ b/lib/netdev-linux.c
Open vSwitch CI fe1a04
@@ -1255,21 +1255,21 @@ netdev_linux_batch_rxq_recv_sock(struct netdev_rxq_linux *rx, int mtu,
Open vSwitch CI fe1a04
      * aux_buf is allocated so that it can be prepended to TSO buffer. */
Open vSwitch CI fe1a04
     std_len = virtio_net_hdr_size + VLAN_ETH_HEADER_LEN + mtu;
Open vSwitch CI fe1a04
     for (i = 0; i < NETDEV_MAX_BURST; i++) {
Open vSwitch CI fe1a04
-         buffers[i] = dp_packet_new_with_headroom(std_len, DP_NETDEV_HEADROOM);
Open vSwitch CI fe1a04
-         iovs[i][IOV_PACKET].iov_base = dp_packet_data(buffers[i]);
Open vSwitch CI fe1a04
-         iovs[i][IOV_PACKET].iov_len = std_len;
Open vSwitch CI fe1a04
-         if (iovlen == IOV_TSO_SIZE) {
Open vSwitch CI fe1a04
-             iovs[i][IOV_AUXBUF].iov_base = dp_packet_data(rx->aux_bufs[i]);
Open vSwitch CI fe1a04
-             iovs[i][IOV_AUXBUF].iov_len = dp_packet_tailroom(rx->aux_bufs[i]);
Open vSwitch CI fe1a04
-         }
Open vSwitch CI fe1a04
+        buffers[i] = dp_packet_new_with_headroom(std_len, DP_NETDEV_HEADROOM);
Open vSwitch CI fe1a04
+        iovs[i][IOV_PACKET].iov_base = dp_packet_data(buffers[i]);
Open vSwitch CI fe1a04
+        iovs[i][IOV_PACKET].iov_len = std_len;
Open vSwitch CI fe1a04
+        if (iovlen == IOV_TSO_SIZE) {
Open vSwitch CI fe1a04
+            iovs[i][IOV_AUXBUF].iov_base = dp_packet_data(rx->aux_bufs[i]);
Open vSwitch CI fe1a04
+            iovs[i][IOV_AUXBUF].iov_len = dp_packet_tailroom(rx->aux_bufs[i]);
Open vSwitch CI fe1a04
+        }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_name = NULL;
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_namelen = 0;
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_iov = iovs[i];
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_iovlen = iovlen;
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_control = &cmsg_buffers[i];
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_controllen = sizeof cmsg_buffers[i];
Open vSwitch CI fe1a04
-         mmsgs[i].msg_hdr.msg_flags = 0;
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_name = NULL;
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_namelen = 0;
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_iov = iovs[i];
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_iovlen = iovlen;
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_control = &cmsg_buffers[i];
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_controllen = sizeof cmsg_buffers[i];
Open vSwitch CI fe1a04
+        mmsgs[i].msg_hdr.msg_flags = 0;
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     do {
Open vSwitch CI fe1a04
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
Open vSwitch CI fe1a04
index e2e829772a..0342a228b7 100644
Open vSwitch CI fe1a04
--- a/lib/ofp-actions.c
Open vSwitch CI fe1a04
+++ b/lib/ofp-actions.c
Open vSwitch CI fe1a04
@@ -4431,6 +4431,7 @@ decode_NXAST_RAW_ENCAP(const struct nx_action_encap *nae,
Open vSwitch CI fe1a04
 {
Open vSwitch CI fe1a04
     struct ofpact_encap *encap;
Open vSwitch CI fe1a04
     const struct ofp_ed_prop_header *ofp_prop;
Open vSwitch CI fe1a04
+    const size_t encap_ofs = out->size;
Open vSwitch CI fe1a04
     size_t props_len;
Open vSwitch CI fe1a04
     uint16_t n_props = 0;
Open vSwitch CI fe1a04
     int err;
Open vSwitch CI fe1a04
@@ -4458,6 +4459,7 @@ decode_NXAST_RAW_ENCAP(const struct nx_action_encap *nae,
Open vSwitch CI fe1a04
         }
Open vSwitch CI fe1a04
         n_props++;
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
+    encap = ofpbuf_at_assert(out, encap_ofs, sizeof *encap);
Open vSwitch CI fe1a04
     encap->n_props = n_props;
Open vSwitch CI fe1a04
     out->header = &encap->ofpact;
Open vSwitch CI fe1a04
     ofpact_finish_ENCAP(out, &encap);
Open vSwitch CI fe1a04
diff --git a/lib/ovsdb-cs.c b/lib/ovsdb-cs.c
Open vSwitch CI fe1a04
index ff8adaefb5..6f9f912ac4 100644
Open vSwitch CI fe1a04
--- a/lib/ovsdb-cs.c
Open vSwitch CI fe1a04
+++ b/lib/ovsdb-cs.c
Open vSwitch CI fe1a04
@@ -1367,7 +1367,7 @@ ovsdb_cs_send_transaction(struct ovsdb_cs *cs, struct json *operations)
Open vSwitch CI fe1a04
                               sizeof *cs->txns);
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
     cs->txns[cs->n_txns++] = request_id;
Open vSwitch CI fe1a04
-    return request_id;
Open vSwitch CI fe1a04
+    return json_clone(request_id);
Open vSwitch CI fe1a04
 }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 /* Makes 'cs' drop its record of transaction 'request_id'.  If a reply arrives
Open vSwitch CI fe1a04
@@ -1380,6 +1380,7 @@ ovsdb_cs_forget_transaction(struct ovsdb_cs *cs, const struct json *request_id)
Open vSwitch CI fe1a04
 {
Open vSwitch CI fe1a04
     for (size_t i = 0; i < cs->n_txns; i++) {
Open vSwitch CI fe1a04
         if (json_equal(request_id, cs->txns[i])) {
Open vSwitch CI fe1a04
+            json_destroy(cs->txns[i]);
Open vSwitch CI fe1a04
             cs->txns[i] = cs->txns[--cs->n_txns];
Open vSwitch CI fe1a04
             return true;
Open vSwitch CI fe1a04
         }
Open vSwitch CI fe1a04
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
Open vSwitch CI fe1a04
index 9c5c633b41..fa8f6cd0e8 100644
Open vSwitch CI fe1a04
--- a/ofproto/connmgr.c
Open vSwitch CI fe1a04
+++ b/ofproto/connmgr.c
Open vSwitch CI fe1a04
@@ -2140,7 +2140,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
Open vSwitch CI fe1a04
                  const struct rule_actions *old_actions)
Open vSwitch CI fe1a04
     OVS_REQUIRES(ofproto_mutex)
Open vSwitch CI fe1a04
 {
Open vSwitch CI fe1a04
-    if (rule_is_hidden(rule)) {
Open vSwitch CI fe1a04
+    if (!mgr || rule_is_hidden(rule)) {
Open vSwitch CI fe1a04
         return;
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -2244,6 +2244,10 @@ ofmonitor_flush(struct connmgr *mgr)
Open vSwitch CI fe1a04
 {
Open vSwitch CI fe1a04
     struct ofconn *ofconn;
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+    if (!mgr) {
Open vSwitch CI fe1a04
+        return;
Open vSwitch CI fe1a04
+    }
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
     LIST_FOR_EACH (ofconn, connmgr_node, &mgr->conns) {
Open vSwitch CI fe1a04
         struct rconn_packet_counter *counter = ofconn->monitor_counter;
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
Open vSwitch CI fe1a04
index 5fae46adfc..ccf97266c0 100644
Open vSwitch CI fe1a04
--- a/ofproto/ofproto-dpif-upcall.c
Open vSwitch CI fe1a04
+++ b/ofproto/ofproto-dpif-upcall.c
Open vSwitch CI fe1a04
@@ -491,6 +491,11 @@ udpif_destroy(struct udpif *udpif)
Open vSwitch CI fe1a04
     dpif_register_upcall_cb(udpif->dpif, NULL, udpif);
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     for (int i = 0; i < N_UMAPS; i++) {
Open vSwitch CI fe1a04
+        struct udpif_key *ukey;
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+        CMAP_FOR_EACH (ukey, cmap_node, &udpif->ukeys[i].cmap) {
Open vSwitch CI fe1a04
+            ukey_delete__(ukey);
Open vSwitch CI fe1a04
+        }
Open vSwitch CI fe1a04
         cmap_destroy(&udpif->ukeys[i].cmap);
Open vSwitch CI fe1a04
         ovs_mutex_destroy(&udpif->ukeys[i].mutex);
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
Open vSwitch CI fe1a04
index 72756eb1f2..ba28e36d78 100644
Open vSwitch CI fe1a04
--- a/ovsdb/ovsdb-client.c
Open vSwitch CI fe1a04
+++ b/ovsdb/ovsdb-client.c
Open vSwitch CI fe1a04
@@ -1664,14 +1664,15 @@ static void
Open vSwitch CI fe1a04
 do_needs_conversion(struct jsonrpc *rpc, const char *database_ OVS_UNUSED,
Open vSwitch CI fe1a04
                     int argc OVS_UNUSED, char *argv[])
Open vSwitch CI fe1a04
 {
Open vSwitch CI fe1a04
+    const char *schema_file_name = argv[argc - 1];
Open vSwitch CI fe1a04
     struct ovsdb_schema *schema1;
Open vSwitch CI fe1a04
-    check_ovsdb_error(ovsdb_schema_from_file(argv[0], &schema1));
Open vSwitch CI fe1a04
+    check_ovsdb_error(ovsdb_schema_from_file(schema_file_name, &schema1));
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     char *database = schema1->name;
Open vSwitch CI fe1a04
     open_rpc(1, NEED_DATABASE, argc, argv, &rpc, &database);
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     if (is_database_clustered(rpc, database)) {
Open vSwitch CI fe1a04
-        ovsdb_schema_persist_ephemeral_columns(schema1, argv[0]);
Open vSwitch CI fe1a04
+        ovsdb_schema_persist_ephemeral_columns(schema1, schema_file_name);
Open vSwitch CI fe1a04
     }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     struct ovsdb_schema *schema2 = fetch_schema(rpc, schema1->name);
Open vSwitch CI fe1a04
diff --git a/ovsdb/raft.c b/ovsdb/raft.c
Open vSwitch CI fe1a04
index ea91d1fdba..192f7f0a96 100644
Open vSwitch CI fe1a04
--- a/ovsdb/raft.c
Open vSwitch CI fe1a04
+++ b/ovsdb/raft.c
Open vSwitch CI fe1a04
@@ -940,6 +940,34 @@ raft_reset_ping_timer(struct raft *raft)
Open vSwitch CI fe1a04
     raft->ping_timeout = time_msec() + raft->election_timer / 3;
Open vSwitch CI fe1a04
 }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+static void
Open vSwitch CI fe1a04
+raft_conn_update_probe_interval(struct raft *raft, struct raft_conn *r_conn)
Open vSwitch CI fe1a04
+{
Open vSwitch CI fe1a04
+    /* Inactivity probe will be sent if connection will remain idle for the
Open vSwitch CI fe1a04
+     * time of an election timeout.  Connection will be dropped if inactivity
Open vSwitch CI fe1a04
+     * will last twice that time.
Open vSwitch CI fe1a04
+     *
Open vSwitch CI fe1a04
+     * It's not enough to just have heartbeats if connection is still
Open vSwitch CI fe1a04
+     * established, but no packets received from the other side.  Without
Open vSwitch CI fe1a04
+     * inactivity probe follower will just try to initiate election
Open vSwitch CI fe1a04
+     * indefinitely staying in 'candidate' role.  And the leader will continue
Open vSwitch CI fe1a04
+     * to send heartbeats to the dead connection thinking that remote server
Open vSwitch CI fe1a04
+     * is still part of the cluster. */
Open vSwitch CI fe1a04
+    int probe_interval = raft->election_timer + ELECTION_RANGE_MSEC;
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+    jsonrpc_session_set_probe_interval(r_conn->js, probe_interval);
Open vSwitch CI fe1a04
+}
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+static void
Open vSwitch CI fe1a04
+raft_update_probe_intervals(struct raft *raft)
Open vSwitch CI fe1a04
+{
Open vSwitch CI fe1a04
+    struct raft_conn *r_conn;
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+    LIST_FOR_EACH (r_conn, list_node, &raft->conns) {
Open vSwitch CI fe1a04
+        raft_conn_update_probe_interval(raft, r_conn);
Open vSwitch CI fe1a04
+    }
Open vSwitch CI fe1a04
+}
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 static void
Open vSwitch CI fe1a04
 raft_add_conn(struct raft *raft, struct jsonrpc_session *js,
Open vSwitch CI fe1a04
               const struct uuid *sid, bool incoming)
Open vSwitch CI fe1a04
@@ -954,7 +982,7 @@ raft_add_conn(struct raft *raft, struct jsonrpc_session *js,
Open vSwitch CI fe1a04
                                               &conn->sid);
Open vSwitch CI fe1a04
     conn->incoming = incoming;
Open vSwitch CI fe1a04
     conn->js_seqno = jsonrpc_session_get_seqno(conn->js);
Open vSwitch CI fe1a04
-    jsonrpc_session_set_probe_interval(js, 0);
Open vSwitch CI fe1a04
+    raft_conn_update_probe_interval(raft, conn);
Open vSwitch CI fe1a04
     jsonrpc_session_set_backlog_threshold(js, raft->conn_backlog_max_n_msgs,
Open vSwitch CI fe1a04
                                               raft->conn_backlog_max_n_bytes);
Open vSwitch CI fe1a04
 }
Open vSwitch CI fe1a04
@@ -2804,6 +2832,7 @@ raft_update_commit_index(struct raft *raft, uint64_t new_commit_index)
Open vSwitch CI fe1a04
                           raft->election_timer, e->election_timer);
Open vSwitch CI fe1a04
                 raft->election_timer = e->election_timer;
Open vSwitch CI fe1a04
                 raft->election_timer_new = 0;
Open vSwitch CI fe1a04
+                raft_update_probe_intervals(raft);
Open vSwitch CI fe1a04
             }
Open vSwitch CI fe1a04
             if (e->servers) {
Open vSwitch CI fe1a04
                 /* raft_run_reconfigure() can write a new Raft entry, which can
Open vSwitch CI fe1a04
@@ -2820,6 +2849,7 @@ raft_update_commit_index(struct raft *raft, uint64_t new_commit_index)
Open vSwitch CI fe1a04
                 VLOG_INFO("Election timer changed from %"PRIu64" to %"PRIu64,
Open vSwitch CI fe1a04
                           raft->election_timer, e->election_timer);
Open vSwitch CI fe1a04
                 raft->election_timer = e->election_timer;
Open vSwitch CI fe1a04
+                raft_update_probe_intervals(raft);
Open vSwitch CI fe1a04
             }
Open vSwitch CI fe1a04
         }
Open vSwitch CI fe1a04
         /* Check if any pending command can be completed, and complete it.
Open vSwitch CI fe1a04
@@ -4468,6 +4498,8 @@ raft_unixctl_status(struct unixctl_conn *conn,
Open vSwitch CI fe1a04
                   : raft->leaving ? "leaving cluster"
Open vSwitch CI fe1a04
                   : raft->left ? "left cluster"
Open vSwitch CI fe1a04
                   : raft->failed ? "failed"
Open vSwitch CI fe1a04
+                  : raft->candidate_retrying
Open vSwitch CI fe1a04
+                      ? "disconnected from the cluster (election timeout)"
Open vSwitch CI fe1a04
                   : "cluster member");
Open vSwitch CI fe1a04
     if (raft->joining) {
Open vSwitch CI fe1a04
         ds_put_format(&s, "Remotes for joining:");
Open vSwitch CI fe1a04
diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
Open vSwitch CI fe1a04
index 5850ac7abf..4226d1cb2f 100644
Open vSwitch CI fe1a04
--- a/python/ovs/db/idl.py
Open vSwitch CI fe1a04
+++ b/python/ovs/db/idl.py
Open vSwitch CI fe1a04
@@ -12,6 +12,7 @@
Open vSwitch CI fe1a04
 # See the License for the specific language governing permissions and
Open vSwitch CI fe1a04
 # limitations under the License.
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+import collections
Open vSwitch CI fe1a04
 import functools
Open vSwitch CI fe1a04
 import uuid
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -39,6 +40,10 @@ OVSDB_UPDATE2 = 1
Open vSwitch CI fe1a04
 CLUSTERED = "clustered"
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+Notice = collections.namedtuple('Notice', ('event', 'row', 'updates'))
Open vSwitch CI fe1a04
+Notice.__new__.__defaults__ = (None,)  # default updates=None
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 class Idl(object):
Open vSwitch CI fe1a04
     """Open vSwitch Database Interface Definition Language (OVSDB IDL).
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -614,6 +619,7 @@ class Idl(object):
Open vSwitch CI fe1a04
             raise error.Error("<table-updates> is not an object",
Open vSwitch CI fe1a04
                               table_updates)
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+        notices = []
Open vSwitch CI fe1a04
         for table_name, table_update in table_updates.items():
Open vSwitch CI fe1a04
             table = tables.get(table_name)
Open vSwitch CI fe1a04
             if not table:
Open vSwitch CI fe1a04
@@ -639,7 +645,9 @@ class Idl(object):
Open vSwitch CI fe1a04
                                       % (table_name, uuid_string))
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
                 if version == OVSDB_UPDATE2:
Open vSwitch CI fe1a04
-                    if self.__process_update2(table, uuid, row_update):
Open vSwitch CI fe1a04
+                    changes = self.__process_update2(table, uuid, row_update)
Open vSwitch CI fe1a04
+                    if changes:
Open vSwitch CI fe1a04
+                        notices.append(changes)
Open vSwitch CI fe1a04
                         self.change_seqno += 1
Open vSwitch CI fe1a04
                     continue
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -652,17 +660,20 @@ class Idl(object):
Open vSwitch CI fe1a04
                     raise error.Error('<row-update> missing "old" and '
Open vSwitch CI fe1a04
                                       '"new" members', row_update)
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
-                if self.__process_update(table, uuid, old, new):
Open vSwitch CI fe1a04
+                changes = self.__process_update(table, uuid, old, new)
Open vSwitch CI fe1a04
+                if changes:
Open vSwitch CI fe1a04
+                    notices.append(changes)
Open vSwitch CI fe1a04
                     self.change_seqno += 1
Open vSwitch CI fe1a04
+        for notice in notices:
Open vSwitch CI fe1a04
+            self.notify(*notice)
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     def __process_update2(self, table, uuid, row_update):
Open vSwitch CI fe1a04
+        """Returns Notice if a column changed, False otherwise."""
Open vSwitch CI fe1a04
         row = table.rows.get(uuid)
Open vSwitch CI fe1a04
-        changed = False
Open vSwitch CI fe1a04
         if "delete" in row_update:
Open vSwitch CI fe1a04
             if row:
Open vSwitch CI fe1a04
                 del table.rows[uuid]
Open vSwitch CI fe1a04
-                self.notify(ROW_DELETE, row)
Open vSwitch CI fe1a04
-                changed = True
Open vSwitch CI fe1a04
+                return Notice(ROW_DELETE, row)
Open vSwitch CI fe1a04
             else:
Open vSwitch CI fe1a04
                 # XXX rate-limit
Open vSwitch CI fe1a04
                 vlog.warn("cannot delete missing row %s from table"
Open vSwitch CI fe1a04
@@ -681,29 +692,27 @@ class Idl(object):
Open vSwitch CI fe1a04
             changed = self.__row_update(table, row, row_update)
Open vSwitch CI fe1a04
             table.rows[uuid] = row
Open vSwitch CI fe1a04
             if changed:
Open vSwitch CI fe1a04
-                self.notify(ROW_CREATE, row)
Open vSwitch CI fe1a04
+                return Notice(ROW_CREATE, row)
Open vSwitch CI fe1a04
         elif "modify" in row_update:
Open vSwitch CI fe1a04
             if not row:
Open vSwitch CI fe1a04
                 raise error.Error('Modify non-existing row')
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
             old_row = self.__apply_diff(table, row, row_update['modify'])
Open vSwitch CI fe1a04
-            self.notify(ROW_UPDATE, row, Row(self, table, uuid, old_row))
Open vSwitch CI fe1a04
-            changed = True
Open vSwitch CI fe1a04
+            return Notice(ROW_UPDATE, row, Row(self, table, uuid, old_row))
Open vSwitch CI fe1a04
         else:
Open vSwitch CI fe1a04
             raise error.Error('<row-update> unknown operation',
Open vSwitch CI fe1a04
                               row_update)
Open vSwitch CI fe1a04
-        return changed
Open vSwitch CI fe1a04
+        return False
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     def __process_update(self, table, uuid, old, new):
Open vSwitch CI fe1a04
-        """Returns True if a column changed, False otherwise."""
Open vSwitch CI fe1a04
+        """Returns Notice if a column changed, False otherwise."""
Open vSwitch CI fe1a04
         row = table.rows.get(uuid)
Open vSwitch CI fe1a04
         changed = False
Open vSwitch CI fe1a04
         if not new:
Open vSwitch CI fe1a04
             # Delete row.
Open vSwitch CI fe1a04
             if row:
Open vSwitch CI fe1a04
                 del table.rows[uuid]
Open vSwitch CI fe1a04
-                changed = True
Open vSwitch CI fe1a04
-                self.notify(ROW_DELETE, row)
Open vSwitch CI fe1a04
+                return Notice(ROW_DELETE, row)
Open vSwitch CI fe1a04
             else:
Open vSwitch CI fe1a04
                 # XXX rate-limit
Open vSwitch CI fe1a04
                 vlog.warn("cannot delete missing row %s from table %s"
Open vSwitch CI fe1a04
@@ -723,7 +732,7 @@ class Idl(object):
Open vSwitch CI fe1a04
             if op == ROW_CREATE:
Open vSwitch CI fe1a04
                 table.rows[uuid] = row
Open vSwitch CI fe1a04
             if changed:
Open vSwitch CI fe1a04
-                self.notify(ROW_CREATE, row)
Open vSwitch CI fe1a04
+                return Notice(ROW_CREATE, row)
Open vSwitch CI fe1a04
         else:
Open vSwitch CI fe1a04
             op = ROW_UPDATE
Open vSwitch CI fe1a04
             if not row:
Open vSwitch CI fe1a04
@@ -737,8 +746,8 @@ class Idl(object):
Open vSwitch CI fe1a04
             if op == ROW_CREATE:
Open vSwitch CI fe1a04
                 table.rows[uuid] = row
Open vSwitch CI fe1a04
             if changed:
Open vSwitch CI fe1a04
-                self.notify(op, row, Row.from_json(self, table, uuid, old))
Open vSwitch CI fe1a04
-        return changed
Open vSwitch CI fe1a04
+                return Notice(op, row, Row.from_json(self, table, uuid, old))
Open vSwitch CI fe1a04
+        return False
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     def __check_server_db(self):
Open vSwitch CI fe1a04
         """Returns True if this is a valid server database, False otherwise."""
Open vSwitch CI fe1a04
diff --git a/tests/automake.mk b/tests/automake.mk
Open vSwitch CI fe1a04
index 677b99a6b4..fc80e027df 100644
Open vSwitch CI fe1a04
--- a/tests/automake.mk
Open vSwitch CI fe1a04
+++ b/tests/automake.mk
Open vSwitch CI fe1a04
@@ -134,7 +134,8 @@ FUZZ_REGRESSION_TESTS = \
Open vSwitch CI fe1a04
 	tests/fuzz-regression/ofp_print_fuzzer-5722747668791296 \
Open vSwitch CI fe1a04
 	tests/fuzz-regression/ofp_print_fuzzer-6285128790704128 \
Open vSwitch CI fe1a04
 	tests/fuzz-regression/ofp_print_fuzzer-6470117922701312 \
Open vSwitch CI fe1a04
-	tests/fuzz-regression/ofp_print_fuzzer-6502620041576448
Open vSwitch CI fe1a04
+	tests/fuzz-regression/ofp_print_fuzzer-6502620041576448 \
Open vSwitch CI fe1a04
+	tests/fuzz-regression/ofp_print_fuzzer-6540965472632832
Open vSwitch CI fe1a04
 $(srcdir)/tests/fuzz-regression-list.at: tests/automake.mk
Open vSwitch CI fe1a04
 	$(AM_V_GEN)for name in $(FUZZ_REGRESSION_TESTS); do \
Open vSwitch CI fe1a04
             basename=`echo $$name | sed 's,^.*/,,'`; \
Open vSwitch CI fe1a04
diff --git a/tests/daemon.at b/tests/daemon.at
Open vSwitch CI fe1a04
index a7982de381..39d9aa391e 100644
Open vSwitch CI fe1a04
--- a/tests/daemon.at
Open vSwitch CI fe1a04
+++ b/tests/daemon.at
Open vSwitch CI fe1a04
@@ -218,11 +218,11 @@ OVS_WAIT_UNTIL([test -s ovsdb-server.pid])
Open vSwitch CI fe1a04
 OVS_WAIT_UNTIL([sc query ovsdb-server | grep STATE | grep RUNNING > /dev/null 2>&1])
Open vSwitch CI fe1a04
 AT_CHECK([kill -0 `cat ovsdb-server.pid`], [0], [ignore])
Open vSwitch CI fe1a04
 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs], [0],
Open vSwitch CI fe1a04
-[Open_vSwitch
Open vSwitch CI fe1a04
+[_Server
Open vSwitch CI fe1a04
 ])
Open vSwitch CI fe1a04
 AT_CHECK([sc stop ovsdb-server], [0], [ignore])
Open vSwitch CI fe1a04
 OVS_WAIT_UNTIL([test ! -s ovsdb-server.pid])
Open vSwitch CI fe1a04
-AT_CHECK([sc query ovsdb-server | grep STATE | grep STOPPED], [0], [ignore])
Open vSwitch CI fe1a04
+OVS_WAIT_UNTIL([sc query ovsdb-server | grep STATE | grep STOPPED > /dev/null 2>&1])
Open vSwitch CI fe1a04
 AT_CHECK([sc delete ovsdb-server], [0], [[[SC]] DeleteService SUCCESS
Open vSwitch CI fe1a04
 ])
Open vSwitch CI fe1a04
 AT_CLEANUP
Open vSwitch CI fe1a04
diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
Open vSwitch CI 0aa018
index 2862a3c9b9..d5765a6632 100644
Open vSwitch CI fe1a04
--- a/tests/dpif-netdev.at
Open vSwitch CI fe1a04
+++ b/tests/dpif-netdev.at
Open vSwitch CI 0aa018
@@ -299,59 +299,61 @@ type=drop rate=1 burst_size=2
Open vSwitch CI 0aa018
 ])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 ovs-appctl time/warp 5000
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+for i in `seq 1 7`; do
Open vSwitch CI 0aa018
+  AT_CHECK(
Open vSwitch CI 0aa018
+    [ovs-appctl netdev-dummy/receive p7 \
Open vSwitch CI 0aa018
+       'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+done
Open vSwitch CI 0aa018
+
Open vSwitch CI 0aa018
+for i in `seq 1 5`; do
Open vSwitch CI 0aa018
+  AT_CHECK(
Open vSwitch CI 0aa018
+    [ovs-appctl netdev-dummy/receive p8 \
Open vSwitch CI 0aa018
+       'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+done
Open vSwitch CI 0aa018
+
Open vSwitch CI 0aa018
 sleep 1  # wait for forwarders process packets
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 # Meter 1 is measuring packets, allowing one packet per second with
Open vSwitch CI 0aa018
-# bursts of one packet, so 4 out of 5 packets should hit the drop
Open vSwitch CI 0aa018
+# bursts of one packet, so 3 out of 5 packets should hit the drop
Open vSwitch CI 0aa018
 # band.
Open vSwitch CI 0aa018
-# Meter 2 is measuring kbps, with burst size 2 (== 2000 bits). 4 packets
Open vSwitch CI 0aa018
-# (240 bytes == 1920 bits) pass, but the last packet should hit the drop band.
Open vSwitch CI 0aa018
+# Meter 2 is measuring kbps, with burst size 2 (== 3000 bits). 6 packets
Open vSwitch CI 0aa018
+# (360 bytes == 2880 bits) pass, but the last packet should hit the drop band.
Open vSwitch CI 0aa018
 AT_CHECK([ovs-ofctl -O OpenFlow13 meter-stats br0 | strip_timers], [0], [dnl
Open vSwitch CI 0aa018
 OFPST_METER reply (OF1.3) (xid=0x2):
Open vSwitch CI 0aa018
 meter:1 flow_count:1 packet_in_count:5 byte_in_count:300 duration:0.0s bands:
Open vSwitch CI 0aa018
-0: packet_count:4 byte_count:240
Open vSwitch CI 0aa018
+0: packet_count:3 byte_count:180
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
-meter:2 flow_count:1 packet_in_count:5 byte_in_count:300 duration:0.0s bands:
Open vSwitch CI 0aa018
+meter:2 flow_count:1 packet_in_count:7 byte_in_count:420 duration:0.0s bands:
Open vSwitch CI 0aa018
 0: packet_count:1 byte_count:60
Open vSwitch CI 0aa018
 ])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 # Advance time by 1/2 second
Open vSwitch CI 0aa018
 ovs-appctl time/warp 500
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
-AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+for i in `seq 1 5`; do
Open vSwitch CI 0aa018
+  AT_CHECK(
Open vSwitch CI 0aa018
+    [ovs-appctl netdev-dummy/receive p7 \
Open vSwitch CI 0aa018
+       'in_port(7),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+
Open vSwitch CI 0aa018
+  AT_CHECK(
Open vSwitch CI 0aa018
+    [ovs-appctl netdev-dummy/receive p8 \
Open vSwitch CI 0aa018
+       'in_port(8),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)' --len 60])
Open vSwitch CI 0aa018
+done
Open vSwitch CI 0aa018
+
Open vSwitch CI 0aa018
 sleep 1  # wait for forwarders process packets
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 # Meter 1 is measuring packets, allowing one packet per second with
Open vSwitch CI 0aa018
 # bursts of one packet, so all 5 of the new packets should hit the drop
Open vSwitch CI 0aa018
 # band.
Open vSwitch CI 0aa018
-# Meter 2 is measuring kbps, with burst size 2 (== 2000 bits). After 500ms
Open vSwitch CI 0aa018
-# there should be space for 80 + 500 bits, so one new 60 byte (480 bit) packet
Open vSwitch CI 0aa018
+# Meter 2 is measuring kbps, with burst size 2 (== 3000 bits). After 500ms
Open vSwitch CI 0aa018
+# there should be space for 120 + 500 bits, so one new 60 byte (480 bit) packet
Open vSwitch CI 0aa018
 # should pass, remaining 4 should hit the drop band.
Open vSwitch CI 0aa018
 AT_CHECK([ovs-ofctl -O OpenFlow13 meter-stats br0 | strip_timers], [0], [dnl
Open vSwitch CI 0aa018
 OFPST_METER reply (OF1.3) (xid=0x2):
Open vSwitch CI 0aa018
 meter:1 flow_count:1 packet_in_count:10 byte_in_count:600 duration:0.0s bands:
Open vSwitch CI 0aa018
-0: packet_count:9 byte_count:540
Open vSwitch CI 0aa018
+0: packet_count:8 byte_count:480
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
-meter:2 flow_count:1 packet_in_count:10 byte_in_count:600 duration:0.0s bands:
Open vSwitch CI 0aa018
+meter:2 flow_count:1 packet_in_count:12 byte_in_count:720 duration:0.0s bands:
Open vSwitch CI 0aa018
 0: packet_count:5 byte_count:300
Open vSwitch CI 0aa018
 ])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
@@ -360,7 +362,7 @@ ovs-appctl time/warp 5000
Open vSwitch CI 0aa018
 AT_CHECK([
Open vSwitch CI 0aa018
 ovs-appctl coverage/read-counter datapath_drop_meter
Open vSwitch CI 0aa018
 ], [0], [dnl
Open vSwitch CI 0aa018
-14
Open vSwitch CI 0aa018
+13
Open vSwitch CI 0aa018
 ])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 AT_CHECK([cat ovs-vswitchd.log | filter_flow_install | strip_xout_keep_actions], [0], [dnl
Open vSwitch CI 0aa018
@@ -589,3 +591,20 @@ arp,in_port=ANY,dl_vlan=11,dl_vlan_pcp=7,vlan_tci1=0x0000,dl_src=00:06:07:08:09:
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy])
Open vSwitch CI fe1a04
 DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy-pmd])
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+AT_SETUP([dpif-netdev - check dpctl/add-flow in_port exact match])
Open vSwitch CI fe1a04
+OVS_VSWITCHD_START(
Open vSwitch CI fe1a04
+  [add-port br0 p1 \
Open vSwitch CI fe1a04
+   -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock \
Open vSwitch CI fe1a04
+   -- set bridge br0 datapath-type=dummy \
Open vSwitch CI fe1a04
+                     other-config:datapath-id=1234 fail-mode=secure])
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+AT_CHECK([ovs-appctl dpctl/add-flow "eth(),eth_type(0x0800),ipv4()" "3"], [2],
Open vSwitch CI fe1a04
+[], [dnl
Open vSwitch CI fe1a04
+ovs-vswitchd: updating flow table (Invalid argument)
Open vSwitch CI fe1a04
+ovs-appctl: ovs-vswitchd: server returned an error
Open vSwitch CI fe1a04
+])
Open vSwitch CI fe1a04
+OVS_WAIT_UNTIL([grep "flow: in_port is not an exact match" ovs-vswitchd.log])
Open vSwitch CI fe1a04
+OVS_VSWITCHD_STOP(["/flow: in_port is not an exact match/d
Open vSwitch CI fe1a04
+/failed to put/d"])
Open vSwitch CI fe1a04
+AT_CLEANUP
Open vSwitch CI fe1a04
diff --git a/tests/fuzz-regression-list.at b/tests/fuzz-regression-list.at
Open vSwitch CI fe1a04
index e3173fb88f..2347c690ef 100644
Open vSwitch CI fe1a04
--- a/tests/fuzz-regression-list.at
Open vSwitch CI fe1a04
+++ b/tests/fuzz-regression-list.at
Open vSwitch CI fe1a04
@@ -21,3 +21,4 @@ TEST_FUZZ_REGRESSION([ofp_print_fuzzer-5722747668791296])
Open vSwitch CI fe1a04
 TEST_FUZZ_REGRESSION([ofp_print_fuzzer-6285128790704128])
Open vSwitch CI fe1a04
 TEST_FUZZ_REGRESSION([ofp_print_fuzzer-6470117922701312])
Open vSwitch CI fe1a04
 TEST_FUZZ_REGRESSION([ofp_print_fuzzer-6502620041576448])
Open vSwitch CI fe1a04
+TEST_FUZZ_REGRESSION([ofp_print_fuzzer-6540965472632832])
Open vSwitch CI fe1a04
diff --git a/tests/fuzz-regression/ofp_print_fuzzer-6540965472632832 b/tests/fuzz-regression/ofp_print_fuzzer-6540965472632832
Open vSwitch CI fe1a04
new file mode 100644
Open vSwitch CI fe1a04
index 0000000000..e69de29bb2
Open vSwitch CI 0aa018
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
Open vSwitch CI 0aa018
index 31064ed95e..24bbd884ca 100644
Open vSwitch CI 0aa018
--- a/tests/ofproto-dpif.at
Open vSwitch CI 0aa018
+++ b/tests/ofproto-dpif.at
Open vSwitch CI 0aa018
@@ -2123,7 +2123,7 @@ AT_CHECK([ovs-appctl revalidator/purge])
Open vSwitch CI 0aa018
 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 dnl Add a controller meter.
Open vSwitch CI 0aa018
-AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br0 'meter=controller pktps stats bands=type=drop rate=2'])
Open vSwitch CI 0aa018
+AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br0 'meter=controller pktps burst stats bands=type=drop rate=1 burst_size=1'])
Open vSwitch CI 0aa018
 
Open vSwitch CI 0aa018
 dnl Advance time by 1 second.
Open vSwitch CI 0aa018
 AT_CHECK([ovs-appctl time/warp 1000], [0], [ignore])
Open vSwitch CI fe1a04
diff --git a/tests/ovsdb-client.at b/tests/ovsdb-client.at
Open vSwitch CI fe1a04
index 8d777a0275..5e3b26aea8 100644
Open vSwitch CI fe1a04
--- a/tests/ovsdb-client.at
Open vSwitch CI fe1a04
+++ b/tests/ovsdb-client.at
Open vSwitch CI fe1a04
@@ -12,6 +12,30 @@ AT_CHECK([ovsdb-client get-schema-cksum unix:socket ordinals], [0], [12345678 9
Open vSwitch CI fe1a04
 OVSDB_SERVER_SHUTDOWN
Open vSwitch CI fe1a04
 AT_CLEANUP
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+AT_SETUP([ovsdb-client needs-conversion (no conversion needed)])
Open vSwitch CI fe1a04
+AT_KEYWORDS([ovsdb client file positive])
Open vSwitch CI fe1a04
+ordinal_schema > schema
Open vSwitch CI fe1a04
+touch .db.~lock~
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db], [0], [ignore], [ignore])
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-client needs-conversion unix:socket schema], [0], [no
Open vSwitch CI fe1a04
+])
Open vSwitch CI fe1a04
+OVSDB_SERVER_SHUTDOWN
Open vSwitch CI fe1a04
+AT_CLEANUP
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
+AT_SETUP([ovsdb-client needs-conversion (conversion needed)])
Open vSwitch CI fe1a04
+AT_KEYWORDS([ovsdb client file positive])
Open vSwitch CI fe1a04
+ordinal_schema > schema
Open vSwitch CI fe1a04
+touch .db.~lock~
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db], [0], [ignore], [ignore])
Open vSwitch CI fe1a04
+sed 's/5\.1\.3/5.1.4/' < schema > schema2
Open vSwitch CI fe1a04
+AT_CHECK([diff schema schema2], [1], [ignore])
Open vSwitch CI fe1a04
+AT_CHECK([ovsdb-client needs-conversion unix:socket schema2], [0], [yes
Open vSwitch CI fe1a04
+])
Open vSwitch CI fe1a04
+OVSDB_SERVER_SHUTDOWN
Open vSwitch CI fe1a04
+AT_CLEANUP
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 AT_SETUP([ovsdb-client backup and restore])
Open vSwitch CI fe1a04
 AT_KEYWORDS([ovsdb client positive])
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
Open vSwitch CI fe1a04
index 4b4791a7da..e00e67e949 100644
Open vSwitch CI fe1a04
--- a/tests/ovsdb-idl.at
Open vSwitch CI fe1a04
+++ b/tests/ovsdb-idl.at
Open vSwitch CI fe1a04
@@ -1486,6 +1486,28 @@ m4_define([OVSDB_CHECK_IDL_NOTIFY],
Open vSwitch CI fe1a04
    [OVSDB_CHECK_IDL_PY([$1], [], [$2], [$3], [notify $4], [$5])
Open vSwitch CI fe1a04
     OVSDB_CHECK_IDL_SSL_PY([$1], [], [$2], [$3], [notify $4], [$5])])
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
+OVSDB_CHECK_IDL_NOTIFY([simple link idl verify notify],
Open vSwitch CI fe1a04
+  [['track-notify' \
Open vSwitch CI fe1a04
+    '["idltest",
Open vSwitch CI fe1a04
+       {"op": "insert",
Open vSwitch CI fe1a04
+       "table": "link1",
Open vSwitch CI fe1a04
+       "row": {"i": 1, "k": ["named-uuid", "l1row"], "l2": ["set", [["named-uuid", "l2row"]]]},
Open vSwitch CI fe1a04
+       "uuid-name": "l1row"},
Open vSwitch CI fe1a04
+      {"op": "insert",
Open vSwitch CI fe1a04
+       "table": "link2",
Open vSwitch CI fe1a04
+       "uuid-name": "l2row",
Open vSwitch CI fe1a04
+       "row": {"i": 2, "l1": ["set", [["named-uuid", "l1row"]]]}}]']],
Open vSwitch CI fe1a04
+[[000: empty
Open vSwitch CI fe1a04
+000: event:create, row={uuid=<0>}, updates=None
Open vSwitch CI fe1a04
+000: event:create, row={uuid=<1>}, updates=None
Open vSwitch CI fe1a04
+001: {"error":null,"result":[{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]}
Open vSwitch CI fe1a04
+002: event:create, row={i=1 uuid=<2> l2=[<3>]}, updates=None
Open vSwitch CI fe1a04
+002: event:create, row={i=2 uuid=<3> l1=[<2>]}, updates=None
Open vSwitch CI fe1a04
+002: i=1 k=1 ka=[] l2=2 uuid=<2>
Open vSwitch CI fe1a04
+002: i=2 l1=1 uuid=<3>
Open vSwitch CI fe1a04
+003: done
Open vSwitch CI fe1a04
+]])
Open vSwitch CI fe1a04
+
Open vSwitch CI fe1a04
 OVSDB_CHECK_IDL_NOTIFY([simple idl verify notify],
Open vSwitch CI fe1a04
   [['track-notify' \
Open vSwitch CI fe1a04
     '["idltest",
Open vSwitch CI fe1a04
diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py
Open vSwitch CI fe1a04
index a196802743..9d3228f234 100644
Open vSwitch CI fe1a04
--- a/tests/test-ovsdb.py
Open vSwitch CI fe1a04
+++ b/tests/test-ovsdb.py
Open vSwitch CI fe1a04
@@ -162,6 +162,8 @@ def get_simple_printable_row_string(row, columns):
Open vSwitch CI fe1a04
             if isinstance(value, dict):
Open vSwitch CI fe1a04
                 value = sorted((row_to_uuid(k), row_to_uuid(v))
Open vSwitch CI fe1a04
                                for k, v in value.items())
Open vSwitch CI fe1a04
+            if isinstance(value, (list, tuple)):
Open vSwitch CI fe1a04
+                value = sorted((row_to_uuid(v) for v in value))
Open vSwitch CI fe1a04
             s += "%s=%s " % (column, value)
Open vSwitch CI fe1a04
     s = s.strip()
Open vSwitch CI fe1a04
     s = re.sub('""|,|u?\'', "", s)
Open vSwitch CI fe1a04
@@ -172,9 +174,10 @@ def get_simple_printable_row_string(row, columns):
Open vSwitch CI fe1a04
     return s
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
-def get_simple_table_printable_row(row):
Open vSwitch CI fe1a04
+def get_simple_table_printable_row(row, *additional_columns):
Open vSwitch CI fe1a04
     simple_columns = ["i", "r", "b", "s", "u", "ia",
Open vSwitch CI fe1a04
                       "ra", "ba", "sa", "ua", "uuid"]
Open vSwitch CI fe1a04
+    simple_columns.extend(additional_columns)
Open vSwitch CI fe1a04
     return get_simple_printable_row_string(row, simple_columns)
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -637,7 +640,8 @@ def do_idl(schema_file, remote, *commands):
Open vSwitch CI fe1a04
     def mock_notify(event, row, updates=None):
Open vSwitch CI fe1a04
         output = "%03d: " % step
Open vSwitch CI fe1a04
         output += "event:" + str(event) + ", row={"
Open vSwitch CI fe1a04
-        output += get_simple_table_printable_row(row) + "}, updates="
Open vSwitch CI fe1a04
+        output += get_simple_table_printable_row(row,
Open vSwitch CI fe1a04
+                                                 'l2', 'l1') + "}, updates="
Open vSwitch CI fe1a04
         if updates is None:
Open vSwitch CI fe1a04
             output += "None"
Open vSwitch CI fe1a04
         else:
Open vSwitch CI fe1a04
diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in
Open vSwitch CI fe1a04
index d71c34e691..4156da20ef 100644
Open vSwitch CI fe1a04
--- a/utilities/ovs-ctl.in
Open vSwitch CI fe1a04
+++ b/utilities/ovs-ctl.in
Open vSwitch CI fe1a04
@@ -226,7 +226,9 @@ start_forwarding () {
Open vSwitch CI fe1a04
     if test X"$OVS_VSWITCHD" = Xyes; then
Open vSwitch CI fe1a04
         do_start_forwarding || return 1
Open vSwitch CI fe1a04
     fi
Open vSwitch CI fe1a04
-    set_hostname &
Open vSwitch CI fe1a04
+    if test X"$RECORD_HOSTNAME" = Xyes; then
Open vSwitch CI fe1a04
+        set_hostname &
Open vSwitch CI fe1a04
+    fi
Open vSwitch CI fe1a04
     return 0
Open vSwitch CI fe1a04
 }
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
@@ -317,6 +319,7 @@ set_defaults () {
Open vSwitch CI fe1a04
     SYSTEM_ID=
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     FULL_HOSTNAME=yes
Open vSwitch CI fe1a04
+    RECORD_HOSTNAME=yes
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
     DELETE_BRIDGES=no
Open vSwitch CI fe1a04
     DELETE_TRANSIENT_PORTS=no
Open vSwitch CI fe1a04
@@ -378,19 +381,24 @@ This program is intended to be invoked internally by Open vSwitch startup
Open vSwitch CI fe1a04
 scripts.  System administrators should not normally invoke it directly.
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 Commands:
Open vSwitch CI fe1a04
-  start                   start Open vSwitch daemons
Open vSwitch CI fe1a04
-  stop                    stop Open vSwitch daemons
Open vSwitch CI fe1a04
-  restart                 stop and start Open vSwitch daemons
Open vSwitch CI fe1a04
-  status                  check whether Open vSwitch daemons are running
Open vSwitch CI fe1a04
-  version                 print versions of Open vSwitch daemons
Open vSwitch CI fe1a04
-  load-kmod               insert modules if not already present
Open vSwitch CI fe1a04
-  force-reload-kmod       save OVS network device state, stop OVS, unload kernel
Open vSwitch CI fe1a04
-                          module, reload kernel module, start OVS, restore state
Open vSwitch CI fe1a04
-  enable-protocol         enable protocol specified in options with iptables
Open vSwitch CI fe1a04
-  delete-transient-ports  delete transient (other_config:transient=true) ports
Open vSwitch CI fe1a04
-  start-ovs-ipsec         start Open vSwitch ipsec daemon
Open vSwitch CI fe1a04
-  stop-ovs-ipsec          stop Open vSwitch ipsec daemon
Open vSwitch CI fe1a04
-  help                    display this help message
Open vSwitch CI fe1a04
+  start                       start Open vSwitch daemons
Open vSwitch CI fe1a04
+  stop                        stop Open vSwitch daemons
Open vSwitch CI fe1a04
+  restart                     stop and start Open vSwitch daemons
Open vSwitch CI fe1a04
+  status                      check whether Open vSwitch daemons are running
Open vSwitch CI fe1a04
+  version                     print versions of Open vSwitch daemons
Open vSwitch CI fe1a04
+  load-kmod                   insert modules if not already present
Open vSwitch CI fe1a04
+  force-reload-kmod           save OVS network device state, stop OVS, unload
Open vSwitch CI fe1a04
+                              kernel module, reload kernel module, start OVS,
Open vSwitch CI fe1a04
+                              restore state
Open vSwitch CI fe1a04
+  enable-protocol             enable protocol specified in options with
Open vSwitch CI fe1a04
+                              iptables
Open vSwitch CI fe1a04
+  delete-transient-ports      delete transient (other_config:transient=true)
Open vSwitch CI fe1a04
+                              ports
Open vSwitch CI fe1a04
+  start-ovs-ipsec             start Open vSwitch ipsec daemon
Open vSwitch CI fe1a04
+  stop-ovs-ipsec              stop Open vSwitch ipsec daemon
Open vSwitch CI fe1a04
+  record-hostname-if-not-set  determine the system hostname and record it in
Open vSwitch CI fe1a04
+                              the Open vSwitch database if not already set
Open vSwitch CI fe1a04
+  help                        display this help message
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 One of the following options is required for "start", "restart" and "force-reload-kmod":
Open vSwitch CI fe1a04
   --system-id=UUID   set specific ID to uniquely identify this system
Open vSwitch CI fe1a04
@@ -411,6 +419,8 @@ Less important options for "start", "restart" and "force-reload-kmod":
Open vSwitch CI fe1a04
   --ovsdb-server-priority=NICE   set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
Open vSwitch CI fe1a04
   --ovs-vswitchd-priority=NICE   set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
Open vSwitch CI fe1a04
   --no-full-hostname             set short hostname instead of full hostname
Open vSwitch CI fe1a04
+  --no-record-hostname           do not attempt to determine/record system
Open vSwitch CI fe1a04
+                                 hostname as part of start command
Open vSwitch CI fe1a04
 
Open vSwitch CI fe1a04
 Debugging options for "start", "restart" and "force-reload-kmod":
Open vSwitch CI fe1a04
   --ovsdb-server-wrapper=WRAPPER
Open vSwitch CI fe1a04
@@ -569,6 +579,9 @@ case $command in
Open vSwitch CI fe1a04
     stop-ovs-ipsec)
Open vSwitch CI fe1a04
         stop_ovs_ipsec
Open vSwitch CI fe1a04
         ;;
Open vSwitch CI fe1a04
+    record-hostname-if-not-set)
Open vSwitch CI fe1a04
+        set_hostname
Open vSwitch CI fe1a04
+        ;;
Open vSwitch CI fe1a04
     help)
Open vSwitch CI fe1a04
         usage
Open vSwitch CI fe1a04
         ;;
Open vSwitch CI fe1a04
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
Open vSwitch CI fe1a04
index a2ad84edef..4597a215d9 100644
Open vSwitch CI fe1a04
--- a/vswitchd/vswitch.xml
Open vSwitch CI fe1a04
+++ b/vswitchd/vswitch.xml
Open vSwitch CI fe1a04
@@ -4660,7 +4660,8 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
Open vSwitch CI fe1a04
         packets per second the CIR would be set to to to 46000000. This value
Open vSwitch CI fe1a04
         can be broken into '1,000,000 x 46'. Where 1,000,000 is the policing
Open vSwitch CI fe1a04
         rate for the number of packets per second and 46 represents the size
Open vSwitch CI fe1a04
-        of the packet data for a 64 byte ip packet.
Open vSwitch CI fe1a04
+        of the packet data for a 64 bytes IP packet without 14 bytes Ethernet
Open vSwitch CI fe1a04
+        and 4 bytes FCS header.
Open vSwitch CI fe1a04
       </column>
Open vSwitch CI fe1a04
       <column name="other_config" key="cbs" type='{"type": "integer"}'>
Open vSwitch CI fe1a04
         The Committed Burst Size (CBS) is measured in bytes and represents a
Open vSwitch CI fe1a04
@@ -4681,7 +4682,8 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
Open vSwitch CI fe1a04
         packets per second the EIR would be set to to to 46000000. This value
Open vSwitch CI fe1a04
         can be broken into '1,000,000 x 46'. Where 1,000,000 is the policing
Open vSwitch CI fe1a04
         rate for the number of packets per second and 46 represents the size
Open vSwitch CI fe1a04
-        of the packet data for a 64 byte ip packet.
Open vSwitch CI fe1a04
+        of the packet data for a 64 bytes IP packet without 14 bytes Ethernet
Open vSwitch CI fe1a04
+        and 4 bytes FCS header.
Open vSwitch CI fe1a04
       </column>
Open vSwitch CI fe1a04
       <column name="other_config" key="ebs" type='{"type": "integer"}'>
Open vSwitch CI fe1a04
         The Excess Burst Size (EBS) is measured in bytes and represents a