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,