+ s->vconn.remote_ip = stream_get_remote_ip(stream);
+ s->vconn.remote_port = stream_get_remote_port(stream);
+ s->vconn.local_ip = stream_get_local_ip(stream);
+ s->vconn.local_port = stream_get_local_port(stream);
+ return &s->vconn;
+}
+
+/* Creates a new vconn that will send and receive data on a stream named 'name'
+ * and stores a pointer to the vconn in '*vconnp'.
+ *
+ * Returns 0 if successful, otherwise a positive errno value. */
+static int
+vconn_stream_open(const char *name_, char *suffix OVS_UNUSED,
+ struct vconn **vconnp)
+{
+ struct stream *stream;
+ char *name;
+ int error;
+
+ if (!strncmp(name_, "tcp:", 4) && count_fields(name_) < 3) {
+ name = xasprintf("%s:%d", name_, OFP_TCP_PORT);
+ } else if (!strncmp(name_, "ssl:", 4) && count_fields(name_) < 3) {
+ name = xasprintf("%s:%d", name_, OFP_SSL_PORT);
+ } else {
+ name = xstrdup(name_);
+ }
+ error = stream_open(name, &stream);
+ free(name);
+
+ if (error && error != EAGAIN) {
+ return error;
+ }
+
+ *vconnp = vconn_stream_new(stream, error);