+ struct vconn_stream *s = vconn_stream_cast(vconn);
+ ssize_t retval;
+
+ stream_run(s->stream);
+ if (!s->txbuf) {
+ return;
+ }
+
+ retval = stream_send(s->stream, ofpbuf_data(s->txbuf), ofpbuf_size(s->txbuf));
+ if (retval < 0) {
+ if (retval != -EAGAIN) {
+ VLOG_ERR_RL(&rl, "send: %s", ovs_strerror(-retval));
+ vconn_stream_clear_txbuf(s);
+ return;
+ }
+ } else if (retval > 0) {
+ ofpbuf_pull(s->txbuf, retval);
+ if (!ofpbuf_size(s->txbuf)) {
+ vconn_stream_clear_txbuf(s);
+ return;
+ }
+ }
+}
+
+static void
+vconn_stream_run_wait(struct vconn *vconn)
+{
+ struct vconn_stream *s = vconn_stream_cast(vconn);
+
+ stream_run_wait(s->stream);
+ if (s->txbuf) {
+ stream_send_wait(s->stream);
+ }
+}
+
+static void
+vconn_stream_wait(struct vconn *vconn, enum vconn_wait_type wait)
+{
+ struct vconn_stream *s = vconn_stream_cast(vconn);