X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fvconn-ssl.c;h=1a32903a8c153104e73418a4e5e70039f224dd2c;hb=5792c5c64a194304b554e2c6b9a9a4c0216c08a4;hp=20bfb9793273c3f7eccc6ba61ed90ceece5a11f7;hpb=064af42167bf4fc9aaea2702d80ce08074b889c0;p=sliver-openvswitch.git diff --git a/lib/vconn-ssl.c b/lib/vconn-ssl.c index 20bfb9793..1a32903a8 100644 --- a/lib/vconn-ssl.c +++ b/lib/vconn-ssl.c @@ -1,17 +1,17 @@ /* * Copyright (c) 2008, 2009 Nicira Networks. * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #include @@ -269,62 +269,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; - } - - /* Glibc 2.7 has a bug in strtok_r when compiling with optimization that - * can cause segfaults here: - * http://sources.redhat.com/bugzilla/show_bug.cgi?id=5614. - * Using "::" instead of the obvious ":" works around it. */ - 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; } } @@ -797,55 +756,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);