X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn-ssl.c;h=2452bcea5d1908612492e1c6eb47414b064e2dc5;hb=3f355f47f8e7343e909ccfa854454d667baf3c38;hp=96890e6b3006bf708feb4bdfbbf2da7fb3b2444f;hpb=e50097d233cb52551702165324514cb6018a7627;p=openvswitch diff --git a/lib/vconn-ssl.c b/lib/vconn-ssl.c index 96890e6b..2452bcea 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 @@ -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, - 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; } } @@ -793,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);