X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fvconn-tcp.c;h=998a20013862e0a5e80e7aac415f6a375f3e4462;hb=e0644b6125e1d92923ecac1b2d71f9f07cdcc21b;hp=9451322330b7cc7c6a1546cf1aa6f1aaeeca7647;hpb=e3fdfed11b8c56aa6a8deffe11a552fed7e7adbc;p=sliver-openvswitch.git diff --git a/lib/vconn-tcp.c b/lib/vconn-tcp.c index 945132233..998a20013 100644 --- a/lib/vconn-tcp.c +++ b/lib/vconn-tcp.c @@ -38,11 +38,19 @@ static int new_tcp_vconn(const char *name, int fd, int connect_status, - const struct sockaddr_in *sin, struct vconn **vconnp) + const struct sockaddr_in *remote, struct vconn **vconnp) { + struct sockaddr_in local; + socklen_t local_len = sizeof local; int on = 1; int retval; + /* Get the local IP and port information */ + retval = getsockname(fd, (struct sockaddr *)&local, &local_len); + if (retval) { + memset(&local, 0, sizeof local); + } + retval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on); if (retval) { VLOG_ERR("%s: setsockopt(TCP_NODELAY): %s", name, strerror(errno)); @@ -50,8 +58,15 @@ new_tcp_vconn(const char *name, int fd, int connect_status, return errno; } - return new_stream_vconn(name, fd, connect_status, sin->sin_addr.s_addr, - true, vconnp); + retval = new_stream_vconn(name, fd, connect_status, true, vconnp); + if (!retval) { + struct vconn *vconn = *vconnp; + vconn_set_remote_ip(vconn, remote->sin_addr.s_addr); + vconn_set_remote_port(vconn, remote->sin_port); + vconn_set_local_ip(vconn, local.sin_addr.s_addr); + vconn_set_local_port(vconn, local.sin_port); + } + return retval; } static int @@ -60,7 +75,7 @@ tcp_open(const char *name, char *suffix, struct vconn **vconnp) struct sockaddr_in sin; int fd, error; - error = tcp_open_active(suffix, OFP_TCP_PORT, NULL, &fd); + error = tcp_open_active(suffix, OFP_TCP_PORT, &sin, &fd); if (fd >= 0) { return new_tcp_vconn(name, fd, error, &sin, vconnp); } else {