static struct vconn * vconn_stream_new(struct stream *stream, int connect_status, uint32_t allowed_versions) { struct vconn_stream *s; s = xmalloc(sizeof *s); vconn_init(&s->vconn, &stream_vconn_class, connect_status, stream_get_name(stream), allowed_versions); s->stream = stream; s->txbuf = NULL; s->rxbuf = NULL; s->n_packets = 0; return &s->vconn; }
int new_stream_vconn(const char *name, int fd, int connect_status, uint32_t ip, bool reconnectable, struct vconn **vconnp) { struct stream_vconn *s; s = xmalloc(sizeof *s); vconn_init(&s->vconn, &stream_vconn_class, connect_status, ip, name, reconnectable); s->fd = fd; s->txbuf = NULL; s->tx_waiter = NULL; s->rxbuf = NULL; *vconnp = &s->vconn; return 0; }
static struct vconn * vconn_stream_new(struct stream *stream, int connect_status) { struct vconn_stream *s; s = malloc(sizeof *s); vconn_init(&s->vconn, &stream_vconn_class, connect_status, stream_get_name(stream)); s->stream = stream; s->txbuf = NULL; s->rxbuf = NULL; s->n_packets = 0; 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; }
static int new_ssl_vconn(const char *name, int fd, enum session_type type, enum ssl_state state, const struct sockaddr_in *sin, struct vconn **vconnp) { struct ssl_vconn *sslv; SSL *ssl = NULL; int on = 1; int retval; /* Check for all the needful configuration. */ if (!has_private_key) { VLOG_ERR("Private key must be configured to use SSL"); goto error; } if (!has_certificate) { VLOG_ERR("Certificate must be configured to use SSL"); goto error; } if (!has_ca_cert && !bootstrap_ca_cert) { VLOG_ERR("CA certificate must be configured to use SSL"); goto error; } if (!SSL_CTX_check_private_key(ctx)) { VLOG_ERR("Private key does not match certificate public key: %s", ERR_error_string(ERR_get_error(), NULL)); goto error; } /* Disable Nagle. */ retval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on); if (retval) { VLOG_ERR("%s: setsockopt(TCP_NODELAY): %s", name, strerror(errno)); close(fd); return errno; } /* Create and configure OpenSSL stream. */ ssl = SSL_new(ctx); if (ssl == NULL) { VLOG_ERR("SSL_new: %s", ERR_error_string(ERR_get_error(), NULL)); close(fd); return ENOPROTOOPT; } if (SSL_set_fd(ssl, fd) == 0) { VLOG_ERR("SSL_set_fd: %s", ERR_error_string(ERR_get_error(), NULL)); goto error; } if (bootstrap_ca_cert && type == CLIENT) { SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL); } /* Create and return the ssl_vconn. */ sslv = xmalloc(sizeof *sslv); vconn_init(&sslv->vconn, &ssl_vconn_class, EAGAIN, sin->sin_addr.s_addr, name, true); sslv->state = state; sslv->type = type; sslv->fd = fd; sslv->ssl = ssl; sslv->rxbuf = NULL; sslv->txbuf = NULL; sslv->tx_waiter = NULL; sslv->rx_want = sslv->tx_want = SSL_NOTHING; *vconnp = &sslv->vconn; return 0; error: if (ssl) { SSL_free(ssl); } close(fd); return ENOPROTOOPT; }