On Sat, Aug 08, 2009 at 05:08:45PM -0300, Christiano Farina Haesbaert wrote:
> I've discovered that my patch reads the wrong tcp table entry, as soon
> as I fix this I'll mail the final patch.
>
I had to add rdomain support to tcpbench so that I can use it in my
test setup. Diff is attached, I hope it does not conflict too much with
the rewrite comming up.
If possible I would like to commit this soon.
--
:wq Claudio
Index: tcpbench.1
===================================================================
RCS file: /cvs/src/usr.bin/tcpbench/tcpbench.1,v
retrieving revision 1.5
diff -u -p -r1.5 tcpbench.1
--- tcpbench.1 26 Jun 2008 07:05:56 -0000 1.5
+++ tcpbench.1 10 Aug 2009 10:04:43 -0000
@@ -31,6 +31,7 @@
.Op Fl p Ar port
.Op Fl r Ar rate
.Op Fl S Ar space
+.Op Fl V Ar rdomain
.Ar hostname
.Nm
.Fl s
@@ -40,6 +41,7 @@
.Op Fl p Ar port
.Op Fl r Ar rate
.Op Fl S Ar space
+.Op Fl V Ar rdomain
.Sh DESCRIPTION
.Nm
is a small tool that performs throughput benchmarking and concurrent
@@ -94,6 +96,9 @@ Place
.Nm
in server mode, where it will listen on all interfaces for incoming
connections.
+.It Fl V Ar rdomain
+Set the routing domain.
+The default is 0.
.It Fl v
Display verbose output.
If specified more than once, increase the detail of information displayed.
Index: tcpbench.c
===================================================================
RCS file: /cvs/src/usr.bin/tcpbench/tcpbench.c,v
retrieving revision 1.8
diff -u -p -r1.8 tcpbench.c
--- tcpbench.c 18 Sep 2008 10:23:33 -0000 1.8
+++ tcpbench.c 9 Aug 2009 10:30:38 -0000
@@ -54,6 +54,8 @@
sig_atomic_t done = 0;
sig_atomic_t print_stats = 0;
+u_int rdomain;
+
struct statctx {
struct timeval t_start, t_last, t_cur;
unsigned long long bytes;
@@ -113,10 +115,10 @@ usage(void)
fprintf(stderr,
"usage: tcpbench -l\n"
" tcpbench [-v] [-B buf] [-k kvars] [-n connections]"
- " [-p port] [-r rate]\n"
+ " [-p port] [-r rate] [-V rdomain]\n"
" [-S space] hostname\n"
" tcpbench -s [-v] [-B buf] [-k kvars] [-p port] [-r rate]"
- " [-S space]\n");
+ " [-S space] [-V rdomain]\n");
exit(1);
}
@@ -500,6 +502,11 @@ serverloop(kvm_t *kvmh, u_long ktcbtab,
warn("socket");
continue;
}
+ if (rdomain && ai->ai_family == AF_INET) {
+ if (setsockopt(sock, IPPROTO_IP, SO_RDOMAIN,
+ &rdomain, sizeof(rdomain)) == -1)
+ err(1, "setsockopt SO_RDOMAIN");
+ }
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
&on, sizeof(on)) == -1)
warn("reuse port");
@@ -646,6 +653,11 @@ clientloop(kvm_t *kvmh, u_long ktcbtab,
warn("socket");
continue;
}
+ if (rdomain && ai->ai_family == AF_INET) {
+ if (setsockopt(sock, IPPROTO_IP, SO_RDOMAIN,
+ &rdomain, sizeof(rdomain)) == -1)
+ err(1, "setsockopt SO_RDOMAIN");
+ }
if (Sflag) {
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
&Sflag, sizeof(Sflag)) == -1)
@@ -757,7 +769,7 @@ main(int argc, char **argv)
struct nlist nl[] = { { "_tcbtable" }, { "" } };
- while ((ch = getopt(argc, argv, "B:hlk:n:p:r:sS:v")) != -1) {
+ while ((ch = getopt(argc, argv, "B:hlk:n:p:r:sS:vV:")) != -1) {
switch (ch) {
case 'l':
list_kvars();
@@ -797,6 +809,13 @@ main(int argc, char **argv)
break;
case 'v':
vflag++;
+ break;
+ case 'V':
+ rdomain = (unsigned int)strtonum(optarg, 0,
+ RT_TABLEID_MAX, &errstr);
+ if (errstr)
+ errx(1, "rdomain value is %s: %s",
+ errstr, optarg);
break;
case 'n':
nconn = strtonum(optarg, 0, 65535, &errstr);