svn commit: r206972 - head/tools/tools/netrate/tcpp
Robert Watson
rwatson at FreeBSD.org
Wed Apr 21 00:52:56 UTC 2010
Author: rwatson
Date: Wed Apr 21 00:52:55 2010
New Revision: 206972
URL: http://svn.freebsd.org/changeset/base/206972
Log:
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.
MFC after: 1 week
Sponsored by: Juniper, Inc.
Modified:
head/tools/tools/netrate/tcpp/tcpp_client.c
head/tools/tools/netrate/tcpp/tcpp_server.c
Modified: head/tools/tools/netrate/tcpp/tcpp_client.c
==============================================================================
--- head/tools/tools/netrate/tcpp/tcpp_client.c Wed Apr 21 00:26:41 2010 (r206971)
+++ head/tools/tools/netrate/tcpp/tcpp_client.c Wed Apr 21 00:52:55 2010 (r206972)
@@ -33,9 +33,11 @@
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/time.h>
+#include <sys/uio.h>
#include <sys/wait.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <err.h>
#include <errno.h>
@@ -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: head/tools/tools/netrate/tcpp/tcpp_server.c
==============================================================================
--- head/tools/tools/netrate/tcpp/tcpp_server.c Wed Apr 21 00:26:41 2010 (r206971)
+++ head/tools/tools/netrate/tcpp/tcpp_server.c Wed Apr 21 00:52:55 2010 (r206972)
@@ -37,6 +37,7 @@
#include <sys/wait.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <err.h>
#include <fcntl.h>
@@ -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");
More information about the svn-src-all
mailing list