X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn-ssl.c;h=f681bdf0470f68a9fac6710a47a185e65cb86eff;hb=378e1f9854e5bee378ff05a26906a45d1673ab7a;hp=d4dbc9f7979f627b8de17126a91cbf47a701122b;hpb=193456d581423f894e57e8463ff5049c0d802f0a;p=openvswitch diff --git a/lib/vconn-ssl.c b/lib/vconn-ssl.c index d4dbc9f7..f681bdf0 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, true); + 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,7 +280,8 @@ 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; + char *save_ptr = NULL; + char *host_name, *port_string; struct sockaddr_in sin; int retval; int fd; @@ -426,19 +438,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 +470,6 @@ ssl_connect(struct vconn *vconn) } else { return 0; } - - } } NOT_REACHED();