X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn-ssl.c;h=2452bcea5d1908612492e1c6eb47414b064e2dc5;hb=3f355f47f8e7343e909ccfa854454d667baf3c38;hp=d4dbc9f7979f627b8de17126a91cbf47a701122b;hpb=193456d581423f894e57e8463ff5049c0d802f0a;p=openvswitch diff --git a/lib/vconn-ssl.c b/lib/vconn-ssl.c index d4dbc9f7..2452bcea 100644 --- a/lib/vconn-ssl.c +++ b/lib/vconn-ssl.c @@ -181,9 +181,11 @@ want_to_poll_events(int want) static int new_ssl_vconn(const char *name, int fd, enum session_type type, - enum ssl_state state, const struct sockaddr_in *sin, + enum ssl_state state, const struct sockaddr_in *remote, struct vconn **vconnp) { + struct sockaddr_in local; + socklen_t local_len = sizeof local; struct ssl_vconn *sslv; SSL *ssl = NULL; int on = 1; @@ -212,6 +214,12 @@ new_ssl_vconn(const char *name, int fd, enum session_type type, goto error; } + /* Get the local IP and port information */ + retval = getsockname(fd, (struct sockaddr *) &local, &local_len); + if (retval) { + memset(&local, 0, sizeof local); + } + /* Disable Nagle. */ retval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on); if (retval) { @@ -238,8 +246,11 @@ new_ssl_vconn(const char *name, int fd, enum session_type type, /* Create and return the ssl_vconn. */ sslv = xmalloc(sizeof *sslv); - vconn_init(&sslv->vconn, &ssl_vconn_class, EAGAIN, - sin->sin_addr.s_addr, sin->sin_port, name, true); + vconn_init(&sslv->vconn, &ssl_vconn_class, EAGAIN, name); + vconn_set_remote_ip(&sslv->vconn, remote->sin_addr.s_addr); + vconn_set_remote_port(&sslv->vconn, remote->sin_port); + vconn_set_local_ip(&sslv->vconn, local.sin_addr.s_addr); + vconn_set_local_port(&sslv->vconn, local.sin_port); sslv->state = state; sslv->type = type; sslv->fd = fd; @@ -269,58 +280,21 @@ ssl_vconn_cast(struct vconn *vconn) static int ssl_open(const char *name, char *suffix, struct vconn **vconnp) { - char *save_ptr, *host_name, *port_string; struct sockaddr_in sin; - int retval; - int fd; + int error, fd; - retval = ssl_init(); - if (retval) { - return retval; - } - - host_name = strtok_r(suffix, ":", &save_ptr); - port_string = strtok_r(NULL, ":", &save_ptr); - if (!host_name) { - ovs_error(0, "%s: bad peer name format", name); - return EAFNOSUPPORT; - } - - memset(&sin, 0, sizeof sin); - sin.sin_family = AF_INET; - if (lookup_ip(host_name, &sin.sin_addr)) { - return ENOENT; - } - sin.sin_port = htons(port_string && *port_string ? atoi(port_string) - : OFP_SSL_PORT); - - /* Create socket. */ - fd = socket(AF_INET, SOCK_STREAM, 0); - if (fd < 0) { - VLOG_ERR("%s: socket: %s", name, strerror(errno)); - return errno; - } - retval = set_nonblocking(fd); - if (retval) { - close(fd); - return retval; + error = ssl_init(); + if (error) { + return error; } - /* Connect socket. */ - retval = connect(fd, (struct sockaddr *) &sin, sizeof sin); - if (retval < 0) { - if (errno == EINPROGRESS) { - return new_ssl_vconn(name, fd, CLIENT, STATE_TCP_CONNECTING, - &sin, vconnp); - } else { - int error = errno; - VLOG_ERR("%s: connect: %s", name, strerror(error)); - close(fd); - return error; - } + error = tcp_open_active(suffix, OFP_SSL_PORT, &sin, &fd); + if (fd >= 0) { + int state = error ? STATE_TCP_CONNECTING : STATE_SSL_CONNECTING; + return new_ssl_vconn(name, fd, CLIENT, state, &sin, vconnp); } else { - return new_ssl_vconn(name, fd, CLIENT, STATE_SSL_CONNECTING, - &sin, vconnp); + VLOG_ERR("%s: connect: %s", name, strerror(error)); + return error; } } @@ -426,19 +400,7 @@ ssl_connect(struct vconn *vconn) sslv->state = STATE_SSL_CONNECTING; /* Fall through. */ - case STATE_SSL_CONNECTING: { - struct sockaddr_in local_addr; - socklen_t addrlen = sizeof(local_addr); - - /* Get the local IP and port information */ - retval = getsockname(sslv->fd, (struct sockaddr *)&local_addr, - &addrlen); - if (retval) { - memset(&local_addr, 0, sizeof local_addr); - } - vconn_set_local_ip(vconn, local_addr.sin_addr.s_addr); - vconn_set_local_port(vconn, local_addr.sin_port); - + case STATE_SSL_CONNECTING: retval = (sslv->type == CLIENT ? SSL_connect(sslv->ssl) : SSL_accept(sslv->ssl)); if (retval != 1) { @@ -470,8 +432,6 @@ ssl_connect(struct vconn *vconn) } else { return 0; } - - } } NOT_REACHED(); @@ -807,55 +767,18 @@ pssl_pvconn_cast(struct pvconn *pvconn) static int pssl_open(const char *name, char *suffix, struct pvconn **pvconnp) { - struct sockaddr_in sin; struct pssl_pvconn *pssl; int retval; int fd; - unsigned int yes = 1; retval = ssl_init(); if (retval) { return retval; } - /* Create socket. */ - fd = socket(AF_INET, SOCK_STREAM, 0); + fd = tcp_open_passive(suffix, OFP_SSL_PORT); if (fd < 0) { - int error = errno; - VLOG_ERR("%s: socket: %s", name, strerror(error)); - return error; - } - - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) < 0) { - int error = errno; - VLOG_ERR("%s: setsockopt(SO_REUSEADDR): %s", name, strerror(errno)); - return error; - } - - memset(&sin, 0, sizeof sin); - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(INADDR_ANY); - sin.sin_port = htons(atoi(suffix) ? atoi(suffix) : OFP_SSL_PORT); - retval = bind(fd, (struct sockaddr *) &sin, sizeof sin); - if (retval < 0) { - int error = errno; - VLOG_ERR("%s: bind: %s", name, strerror(error)); - close(fd); - return error; - } - - retval = listen(fd, 10); - if (retval < 0) { - int error = errno; - VLOG_ERR("%s: listen: %s", name, strerror(error)); - close(fd); - return error; - } - - retval = set_nonblocking(fd); - if (retval) { - close(fd); - return retval; + return -fd; } pssl = xmalloc(sizeof *pssl);