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 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 fe1a04
index 4381c618f1..816945375b 100644
Open vSwitch CI fe1a04
--- a/lib/dpif-netdev.c
Open vSwitch CI fe1a04
+++ b/lib/dpif-netdev.c
Open vSwitch CI fe1a04
@@ -3834,6 +3834,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 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 fe1a04
index 2862a3c9b9..3e62225571 100644
Open vSwitch CI fe1a04
--- a/tests/dpif-netdev.at
Open vSwitch CI fe1a04
+++ b/tests/dpif-netdev.at
Open vSwitch CI fe1a04
@@ -589,3 +589,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 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