Hi, mikeb spotted this, we're actually calling the setsockopt for IPV6 too, which always fails, this uses setrtable which is less code and doesn't complain on IPV6 socks.
Can someone that uses rdomain test this please ? Index: tcpbench.c =================================================================== RCS file: /cvs/src/usr.bin/tcpbench/tcpbench.c,v retrieving revision 1.36 diff -d -u -p -r1.36 tcpbench.c --- tcpbench.c 16 Jun 2012 17:18:11 -0000 1.36 +++ tcpbench.c 11 Aug 2012 17:06:15 -0000 @@ -61,7 +61,6 @@ /* Our tcpbench globals */ struct { - u_int Vflag; /* rtableid */ int Sflag; /* Socket buffer size (tcp mode) */ u_int rflag; /* Report rate (ms) */ int sflag; /* True if server */ @@ -752,15 +751,6 @@ server_init(struct addrinfo *aitop, stru warn("socket"); continue; } - if (ptb->Vflag) { - if (setsockopt(sock, SOL_SOCKET, SO_RTABLE, - &ptb->Vflag, sizeof(ptb->Vflag)) == -1) { - if (errno == ENOPROTOOPT) - warn("set rtable"); - else - err(1, "setsockopt SO_RTABLE"); - } - } if (ptb->Tflag != -1 && ai->ai_family == AF_INET) { if (setsockopt(sock, IPPROTO_IP, IP_TOS, &ptb->Tflag, sizeof(ptb->Tflag))) @@ -890,15 +880,6 @@ client_init(struct addrinfo *aitop, int &ptb->Tflag, sizeof(ptb->Tflag))) err(1, "setsockopt IPV6_TCLASS"); } - if (ptb->Vflag) { - if (setsockopt(sock, SOL_SOCKET, SO_RTABLE, - &ptb->Vflag, sizeof(ptb->Vflag)) == -1) { - if (errno == ENOPROTOOPT) - warn("set rtable"); - else - err(1, "setsockopt SO_RTABLE"); - } - } if (ptb->Sflag) { if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &ptb->Sflag, sizeof(ptb->Sflag)) == -1) @@ -1006,7 +987,7 @@ main(int argc, char **argv) extern int optind; extern char *optarg; struct timeval tv; - unsigned int secs; + unsigned int secs, rtable; char kerr[_POSIX2_LINE_MAX], *tmp; struct addrinfo *aitop, *aib, hints; @@ -1022,7 +1003,7 @@ main(int argc, char **argv) setlinebuf(stdout); ptb = &tcpbench; ptb->dummybuf_len = 0; - ptb->Sflag = ptb->sflag = ptb->vflag = ptb->Vflag = 0; + ptb->Sflag = ptb->sflag = ptb->vflag = 0; ptb->kvmh = NULL; ptb->kvars = NULL; ptb->rflag = DEFAULT_STATS_INTERVAL; @@ -1076,11 +1057,13 @@ main(int argc, char **argv) ptb->vflag++; break; case 'V': - ptb->Vflag = (unsigned int)strtonum(optarg, 0, + rtable = (unsigned int)strtonum(optarg, 0, RT_TABLEID_MAX, &errstr); if (errstr) errx(1, "rtable value is %s: %s", errstr, optarg); + if (setrtable(rtable) == -1) + err(1, "setrtable"); break; case 'n': nconn = strtonum(optarg, 0, 65535, &errstr);