Hello -

ftp, ntpd, and telnet set IPTOS_LOWDELAY/IPTOS_THROUGHPUT for IPv4
sockets.  Should we do it for IPv6 as well?  I used
IPTOS_DCSP_AF21/IPTOS_DSCP_CS1 to match the values ssh uses by default.

Thoughts?

Index: usr.bin/ftp/ftp.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/ftp.c,v
retrieving revision 1.100
diff -u -p -r1.100 ftp.c
--- usr.bin/ftp/ftp.c   22 Aug 2016 16:27:00 -0000      1.100
+++ usr.bin/ftp/ftp.c   30 Oct 2018 19:31:34 -0000
@@ -257,10 +257,15 @@ hookup(char *host, char *port)
                code = -1;
                goto bad;
        }
-       if (hisctladdr.sa.sa_family == AF_INET) {
+       switch (hisctladdr.sa.sa_family) {
+       case AF_INET:
                tos = IPTOS_LOWDELAY;
-               if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, 
sizeof(int)) < 0)
-                       warn("setsockopt TOS (ignored)");
+               if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
+                       warn("setsockopt IPTOS_LOWDELAY");
+       case AF_INET6:
+               tos = IPTOS_DSCP_AF21;
+               if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)) 
< 0)
+                       warn("setsockopt IPTOS_DSCP_AF21");
        }
        cin = fdopen(s, "r");
        cout = fdopen(s, "w");
@@ -1524,11 +1529,17 @@ reinit:
                        warn("connect");
                        goto bad;
                }
-               if (data_addr.sa.sa_family == AF_INET) {
+               switch (data_addr.sa.sa_family) {
+               case AF_INET:
                        on = IPTOS_THROUGHPUT;
-                       if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,
-                                      sizeof(int)) < 0)
-                               warn("setsockopt TOS (ignored)");
+                       if (setsockopt(data, IPPROTO_IP, IP_TOS, &on,
+                           sizeof(on)) < 0)
+                               warn("setsockopt IPTOS_THROUGHPUT");
+               case AF_INET6:
+                       on = IPTOS_DSCP_CS1;
+                       if (setsockopt(data, IPPROTO_IPV6, IPV6_TCLASS, &on,
+                           sizeof(on)) < 0)
+                               warn("setsockopt IPTOS_DSCP_CS1");
                }
                return (0);
        }
@@ -1682,7 +1693,7 @@ dataconn(const char *lmode)
 {
        union sockaddr_union from;
        socklen_t fromlen = myctladdr.sa.sa_len;
-       int s;
+       int s, tos;
 
        if (passivemode)
                return (fdopen(data, lmode));
@@ -1695,12 +1706,16 @@ dataconn(const char *lmode)
        }
        (void)close(data);
        data = s;
-       if (from.sa.sa_family == AF_INET) {
-               int tos = IPTOS_THROUGHPUT;
-               if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos,
-                               sizeof(int)) < 0) {
-                       warn("setsockopt TOS (ignored)");
-               }
+       switch (from.sa.sa_family) {
+       case AF_INET:
+               tos = IPTOS_THROUGHPUT;
+               if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
+                       warn("setsockopt IPTOS_THROUGHPUT");
+       case AF_INET6:
+               tos = IPTOS_DSCP_CS1;
+               if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &tos,
+                   sizeof(tos)) < 0)
+                       warn("setsockopt IPTOS_DSCP_CS1");
        }
        return (fdopen(data, lmode));
 }
Index: usr.bin/telnet/commands.c
===================================================================
RCS file: /cvs/src/usr.bin/telnet/commands.c,v
retrieving revision 1.86
diff -u -p -r1.86 commands.c
--- usr.bin/telnet/commands.c   30 Sep 2018 14:35:32 -0000      1.86
+++ usr.bin/telnet/commands.c   30 Oct 2018 19:31:35 -0000
@@ -1742,8 +1742,8 @@ tn(int argc, char *argv[])
 {
     struct addrinfo hints, *res, *res0;
     char *cmd, *hostp = 0, *portp = 0, *user = 0, *aliasp = 0;
-    int error, retry;
-    const int niflags = NI_NUMERICHOST, tos = IPTOS_LOWDELAY;
+    int error, retry, tos;
+    const int niflags = NI_NUMERICHOST;
 
     if (connected) {
        printf("?Already connected to %s\r\n", hostname);
@@ -1870,11 +1870,13 @@ tn(int argc, char *argv[])
 
        switch (res->ai_family) {
        case AF_INET:
+               tos = IPTOS_LOWDELAY;
                if (setsockopt(net, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0
                    && errno != ENOPROTOOPT)
                        perror("telnet: setsockopt (IP_TOS) (ignored)");
                break;
        case AF_INET6:
+               tos = IPTOS_DSCP_AF21;
                if (setsockopt(net, IPPROTO_IPV6, IPV6_TCLASS, &tos,
                    sizeof(tos)) < 0 && errno != ENOPROTOOPT)
                        perror("telnet: setsockopt (IPV6_TCLASS) (ignored)");
Index: usr.sbin/ntpd/client.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/client.c,v
retrieving revision 1.105
diff -u -p -r1.105 client.c
--- usr.sbin/ntpd/client.c      30 May 2017 23:30:48 -0000      1.105
+++ usr.sbin/ntpd/client.c      30 Oct 2018 19:31:35 -0000
@@ -164,10 +164,20 @@ client_query(struct ntp_peer *p)
                        } else
                                fatal("client_query connect");
                }
-               val = IPTOS_LOWDELAY;
-               if (p->addr->ss.ss_family == AF_INET && setsockopt(p->query->fd,
-                   IPPROTO_IP, IP_TOS, &val, sizeof(val)) == -1)
-                       log_warn("setsockopt IPTOS_LOWDELAY");
+               switch (p->addr->ss.ss_family) {
+               case AF_INET:
+                       val = IPTOS_LOWDELAY;
+                       if (setsockopt(p->query->fd, IPPROTO_IP, IP_TOS, &val,
+                           sizeof(val)) == -1) {
+                               log_warn("setsockopt IPTOS_LOWDELAY");
+                       }
+               case AF_INET6:
+                       val = IPTOS_DSCP_AF21;
+                       if (setsockopt(p->query->fd, IPPROTO_IPV6, IPV6_TCLASS,
+                           &val, sizeof(val)) == -1) {
+                               log_warn("setsockopt IPTOS_DSCP_AF21");
+                       }
+               }
                val = 1;
                if (setsockopt(p->query->fd, SOL_SOCKET, SO_TIMESTAMP,
                    &val, sizeof(val)) == -1)
Index: usr.sbin/ntpd/server.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/server.c,v
retrieving revision 1.44
diff -u -p -r1.44 server.c
--- usr.sbin/ntpd/server.c      3 Sep 2016 11:52:06 -0000       1.44
+++ usr.sbin/ntpd/server.c      30 Oct 2018 19:31:35 -0000
@@ -39,7 +39,7 @@ setup_listeners(struct servent *se, stru
        u_int8_t                *a6;
        size_t                   sa6len = sizeof(struct in6_addr);
        u_int                    new_cnt = 0;
-       int                      tos = IPTOS_LOWDELAY, rdomain = 0;
+       int                      tos, rdomain = 0;
 
        TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) {
                switch (lap->sa.ss_family) {
@@ -119,9 +119,20 @@ setup_listeners(struct servent *se, stru
                if ((la->fd = socket(la->sa.ss_family, SOCK_DGRAM, 0)) == -1)
                        fatal("socket");
 
-               if (la->sa.ss_family == AF_INET && setsockopt(la->fd,
-                   IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1)
-                       log_warn("setsockopt IPTOS_LOWDELAY");
+               switch (la->sa.ss_family) {
+               case AF_INET:
+                       tos = IPTOS_LOWDELAY;
+                       if (setsockopt(la->fd, IPPROTO_IP, IP_TOS, &tos,
+                           sizeof(tos)) == -1) {
+                               log_warn("setsockopt IPTOS_LOWDELAY");
+                       }
+               case AF_INET6:
+                       tos = IPTOS_DSCP_AF21;
+                       if (setsockopt(la->fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,
+                          sizeof(tos)) == -1) {
+                               log_warn("setsockopt IPTOS_DSCP_AF21");
+                       }
+               }
 
                if (la->rtable != -1 &&
                    setsockopt(la->fd, SOL_SOCKET, SO_RTABLE, &la->rtable,

Reply via email to