X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn-tcp.c;h=aac716623de0ed09845c1cbf12d7c45014fbe3e8;hb=49c36903d6d65bed96cba31f05534510a21a68d7;hp=0ff163ef5b926fa7affc5a80c0b5f72b2e66a01b;hpb=78ff02708b11df94ac2cdf6fe82dc922758c7e30;p=openvswitch diff --git a/lib/vconn-tcp.c b/lib/vconn-tcp.c index 0ff163ef..aac71662 100644 --- a/lib/vconn-tcp.c +++ b/lib/vconn-tcp.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 @@ -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, NULL, 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 = inet_open_active(SOCK_STREAM, suffix, OFP_TCP_PORT, &sin, &fd); if (fd >= 0) { return new_tcp_vconn(name, fd, error, &sin, vconnp); } else { @@ -89,11 +104,11 @@ ptcp_open(const char *name UNUSED, char *suffix, struct pvconn **pvconnp) { int fd; - fd = tcp_open_passive(suffix, OFP_TCP_PORT); + fd = inet_open_passive(SOCK_STREAM, suffix, OFP_TCP_PORT); if (fd < 0) { return -fd; } else { - return new_pstream_pvconn("ptcp", fd, ptcp_accept, pvconnp); + return new_pstream_pvconn("ptcp", fd, ptcp_accept, NULL, pvconnp); } }