Implement the nc(1) -D socket debug option also in tcpbench(1).
authorbluhm <bluhm@openbsd.org>
Thu, 4 Feb 2021 18:46:25 +0000 (18:46 +0000)
committerbluhm <bluhm@openbsd.org>
Thu, 4 Feb 2021 18:46:25 +0000 (18:46 +0000)
This allows to analyse TCP connections.
OK claudio@

usr.bin/tcpbench/tcpbench.1
usr.bin/tcpbench/tcpbench.c

index 9f7a706..13232f0 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tcpbench.1,v 1.28 2020/05/04 12:13:09 sthen Exp $
+.\" $OpenBSD: tcpbench.1,v 1.29 2021/02/04 18:46:25 bluhm Exp $
 .\"
 .\" Copyright (c) 2008 Damien Miller <djm@mindrot.org>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: May 4 2020 $
+.Dd $Mdocdate: February 4 2021 $
 .Dt TCPBENCH 1
 .Os
 .Sh NAME
@@ -24,7 +24,7 @@
 .Nm
 .Fl l
 .Nm
-.Op Fl 46RUuv
+.Op Fl 46DRUuv
 .Op Fl B Ar buf
 .Op Fl b Ar sourceaddr
 .Op Fl k Ar kvars
@@ -39,7 +39,7 @@
 .Nm
 .Bk -words
 .Fl s
-.Op Fl 46Uuv
+.Op Fl 46DUuv
 .Op Fl B Ar buf
 .Op Fl k Ar kvars
 .Op Fl p Ar port
@@ -111,6 +111,8 @@ stream.
 .It Fl b Ar sourceaddr
 Specify the IP address to send the packets from,
 which is useful on machines with multiple interfaces.
+.It Fl D
+Enable debugging on the socket.
 .It Fl k Ar kvars
 Specify one or more kernel variables to monitor; multiple variables must be
 separated with commas.
index 18da6be..c56752c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcpbench.c,v 1.63 2020/05/04 12:13:09 sthen Exp $     */
+/*     $OpenBSD: tcpbench.c,v 1.64 2021/02/04 18:46:25 bluhm Exp $     */
 
 /*
  * Copyright (c) 2008 Damien Miller <djm@mindrot.org>
@@ -65,6 +65,7 @@
 
 /* Our tcpbench globals */
 struct {
+       int       Dflag;        /* Socket debug */
        int       Sflag;        /* Socket buffer size */
        u_int     rflag;        /* Report rate (ms) */
        int       sflag;        /* True if server */
@@ -198,10 +199,10 @@ usage(void)
 {
        fprintf(stderr,
            "usage: tcpbench -l\n"
-           "       tcpbench [-46RUuv] [-B buf] [-b sourceaddr] [-k kvars] [-n connections]\n"
+           "       tcpbench [-46DRUuv] [-B buf] [-b sourceaddr] [-k kvars] [-n connections]\n"
            "                [-p port] [-r interval] [-S space] [-T toskeyword]\n"
            "                [-t secs] [-V rtable] hostname\n"
-           "       tcpbench -s [-46Uuv] [-B buf] [-k kvars] [-p port] [-r interval]\n"
+           "       tcpbench -s [-46DUuv] [-B buf] [-k kvars] [-p port] [-r interval]\n"
            "                [-S space] [-T toskeyword] [-V rtable] [hostname]\n");
        exit(1);
 }
@@ -857,6 +858,11 @@ server_init(struct addrinfo *aitop)
                                warn("socket");
                        continue;
                }
+               if (ptb->Dflag) {
+                       if (setsockopt(sock, SOL_SOCKET, SO_DEBUG,
+                           &ptb->Dflag, sizeof(ptb->Dflag)))
+                               err(1, "setsockopt SO_DEBUG");
+               }
                if (ptb->Tflag != -1 && ai->ai_family == AF_INET) {
                        if (setsockopt(sock, IPPROTO_IP, IP_TOS,
                            &ptb->Tflag, sizeof(ptb->Tflag)))
@@ -970,6 +976,11 @@ client_init(struct addrinfo *aitop, int nconn, struct addrinfo *aib)
                                        warn("socket");
                                continue;
                        }
+                       if (ptb->Dflag) {
+                               if (setsockopt(sock, SOL_SOCKET, SO_DEBUG,
+                                   &ptb->Dflag, sizeof(ptb->Dflag)))
+                                       err(1, "setsockopt SO_DEBUG");
+                       }
                        if (aib != NULL) {
                                saddr_ntop(aib->ai_addr, aib->ai_addrlen,
                                    tmp, sizeof(tmp));
@@ -1138,6 +1149,7 @@ main(int argc, char **argv)
        setvbuf(stdout, NULL, _IOLBF, 0);
        ptb = &tcpbench;
        ptb->dummybuf_len = 0;
+       ptb->Dflag = 0;
        ptb->Sflag = ptb->sflag = ptb->vflag = ptb->Rflag = ptb->Uflag = 0;
        ptb->kvmh  = NULL;
        ptb->kvars = NULL;
@@ -1147,7 +1159,8 @@ main(int argc, char **argv)
        aib = NULL;
        secs = 0;
 
-       while ((ch = getopt(argc, argv, "46b:B:hlk:n:p:Rr:sS:t:T:uUvV:")) != -1) {
+       while ((ch = getopt(argc, argv, "46b:B:Dhlk:n:p:Rr:sS:t:T:uUvV:"))
+           != -1) {
                switch (ch) {
                case '4':
                        family = PF_INET;
@@ -1158,6 +1171,9 @@ main(int argc, char **argv)
                case 'b':
                        srcbind = optarg;
                        break;
+               case 'D':
+                       ptb->Dflag = 1;
+                       break;
                case 'l':
                        list_kvars();
                        exit(0);