From owner-svn-src-stable@FreeBSD.ORG Tue Jun 1 14:26:27 2010 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A8D271065674; Tue, 1 Jun 2010 14:26:27 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 96E928FC13; Tue, 1 Jun 2010 14:26:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o51EQRsd056552; Tue, 1 Jun 2010 14:26:27 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o51EQRe1056549; Tue, 1 Jun 2010 14:26:27 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <201006011426.o51EQRe1056549@svn.freebsd.org> From: Robert Watson Date: Tue, 1 Jun 2010 14:26:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r208701 - stable/8/tools/tools/netrate/tcpp X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Jun 2010 14:26:27 -0000 Author: rwatson Date: Tue Jun 1 14:26:27 2010 New Revision: 208701 URL: http://svn.freebsd.org/changeset/base/208701 Log: Merge r206972 from head to stable/8: Merge @176820, @176822, @177156 to tcpp from P4 to HEAD: Improve accuracy of connection data transfer math. Disable Nagle's algorithm to avoid delaying transfers of data -- will want to refine this to combine payload with header transfer, however. Now that we're running w/o Nagle, try to send the initial data burst with the header in a single TCP segment. Prefer %zu to %ju for size_t. Sponsored by: Juniper, Inc. Approved by: re (bz) Modified: stable/8/tools/tools/netrate/tcpp/tcpp_client.c stable/8/tools/tools/netrate/tcpp/tcpp_server.c Directory Properties: stable/8/tools/tools/netrate/tcpp/ (props changed) Modified: stable/8/tools/tools/netrate/tcpp/tcpp_client.c ============================================================================== --- stable/8/tools/tools/netrate/tcpp/tcpp_client.c Tue Jun 1 14:21:24 2010 (r208700) +++ stable/8/tools/tools/netrate/tcpp/tcpp_client.c Tue Jun 1 14:26:27 2010 (r208701) @@ -33,9 +33,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -82,6 +84,7 @@ static int kq; static int started; /* Number started so far. */ static int finished; /* Number finished so far. */ static int counter; /* IP number offset. */ +static uint64_t payload_len; static struct connection * tcpp_client_newconn(void) @@ -109,6 +112,9 @@ tcpp_client_newconn(void) i = 1; if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof(i)) < 0) err(-1, "setsockopt"); + i = 1; + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &i, sizeof(i)) < 0) + err(-1, "setsockopt"); #if 0 i = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)) < 0) @@ -131,7 +137,7 @@ tcpp_client_newconn(void) conn->conn_magic = CONNECTION_MAGIC; conn->conn_fd = fd; conn->conn_header.th_magic = TCPP_MAGIC; - conn->conn_header.th_len = bflag; + conn->conn_header.th_len = payload_len; tcpp_header_encode(&conn->conn_header); EV_SET(&kev, fd, EVFILT_WRITE, EV_ADD, 0, 0, conn); @@ -156,16 +162,22 @@ static void tcpp_client_handleconn(struct kevent *kev) { struct connection *conn; - ssize_t len; + struct iovec iov[2]; + ssize_t len, header_left; conn = kev->udata; if (conn->conn_magic != CONNECTION_MAGIC) errx(-1, "tcpp_client_handleconn: magic"); if (conn->conn_header_sent < sizeof(conn->conn_header)) { - len = write(conn->conn_fd, ((u_char *)&conn->conn_header) + - conn->conn_header_sent, sizeof(conn->conn_header) - - conn->conn_header_sent); + header_left = sizeof(conn->conn_header) - + conn->conn_header_sent; + iov[0].iov_base = ((u_char *)&conn->conn_header) + + conn->conn_header_sent; + iov[0].iov_len = header_left; + iov[1].iov_base = buffer; + iov[1].iov_len = min(sizeof(buffer), payload_len); + len = writev(conn->conn_fd, iov, 2); if (len < 0) { tcpp_client_closeconn(conn); err(-1, "tcpp_client_handleconn: header write"); @@ -175,10 +187,14 @@ tcpp_client_handleconn(struct kevent *ke errx(-1, "tcpp_client_handleconn: header write " "premature EOF"); } - conn->conn_header_sent += len; + if (len > header_left) { + conn->conn_data_sent += (len - header_left); + conn->conn_header_sent += header_left; + } else + conn->conn_header_sent += len; } else { len = write(conn->conn_fd, buffer, min(sizeof(buffer), - bflag - conn->conn_data_sent)); + payload_len - conn->conn_data_sent)); if (len < 0) { tcpp_client_closeconn(conn); err(-1, "tcpp_client_handleconn: data write"); @@ -189,12 +205,12 @@ tcpp_client_handleconn(struct kevent *ke "premature EOF"); } conn->conn_data_sent += len; - if (conn->conn_data_sent >= bflag) { - /* - * All is well. - */ - tcpp_client_closeconn(conn); - } + } + if (conn->conn_data_sent >= payload_len) { + /* + * All is well. + */ + tcpp_client_closeconn(conn); } } @@ -261,6 +277,11 @@ tcpp_client(void) pid_t pid; int i, failed, status; + if (bflag < sizeof(struct tcpp_header)) + errx(-1, "Can't use -b less than %zu\n", + sizeof(struct tcpp_header)); + payload_len = bflag - sizeof(struct tcpp_header); + pid_list = malloc(sizeof(*pid_list) * pflag); if (pid_list == NULL) err(-1, "malloc pid_list"); Modified: stable/8/tools/tools/netrate/tcpp/tcpp_server.c ============================================================================== --- stable/8/tools/tools/netrate/tcpp/tcpp_server.c Tue Jun 1 14:21:24 2010 (r208700) +++ stable/8/tools/tools/netrate/tcpp/tcpp_server.c Tue Jun 1 14:26:27 2010 (r208701) @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -239,6 +240,10 @@ tcpp_server_worker(int workernum) if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEPORT, &i, sizeof(i)) < 0) err(-1, "setsockopt"); + i = 1; + if (setsockopt(listen_sock, IPPROTO_TCP, TCP_NODELAY, &i, sizeof(i)) + < 0) + err(-1, "setsockopt"); if (bind(listen_sock, (struct sockaddr *)&localipbase, sizeof(localipbase)) < 0) err(-1, "bind");