Like in nc(1) IPTOS_* (supposedly IPv4) values are used for the IPv6
path.  That's not a concern in practice.


Index: ftpd.c
===================================================================
RCS file: /cvs/src/libexec/ftpd/ftpd.c,v
retrieving revision 1.221
diff -u -p -p -u -r1.221 ftpd.c
--- ftpd.c      31 Aug 2016 13:43:36 -0000      1.221
+++ ftpd.c      31 Aug 2016 15:35:27 -0000
@@ -531,11 +531,18 @@ main(int argc, char *argv[])
                reply(530, "System not available.");
                exit(1);
        }
-       if (his_addr.su_family == AF_INET) {
-               tos = IPTOS_LOWDELAY;
+       tos = IPTOS_LOWDELAY;
+       switch (his_addr.su_family) {
+       case AF_INET:
                if (setsockopt(0, IPPROTO_IP, IP_TOS, &tos,
                    sizeof(int)) < 0)
                        syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
+               break;
+       case AF_INET6:
+               if (setsockopt(0, IPPROTO_IPV6, IPV6_TCLASS, &tos,
+                   sizeof(int)) < 0)
+                       syslog(LOG_WARNING, "setsockopt (IPV6_TCLASS): %m");
+               break;
        }
        data_source.su_port = htons(ntohs(ctrl_addr.su_port) - 1);
 
@@ -1269,7 +1276,7 @@ done:
 static FILE *
 getdatasock(char *mode)
 {
-       int on = 1, s, t, tries;
+       int on = 1, s, t, tos, tries;
 
        if (data >= 0)
                return (fdopen(data, mode));
@@ -1293,11 +1300,18 @@ getdatasock(char *mode)
        }
        sigprocmask (SIG_UNBLOCK, &allsigs, NULL);
 
-       if (ctrl_addr.su_family == AF_INET) {
-               on = IPTOS_THROUGHPUT;
-               if (setsockopt(s, IPPROTO_IP, IP_TOS, &on,
+       tos = IPTOS_THROUGHPUT;
+       switch (ctrl_addr.su_family) {
+       case AF_INET:
+               if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos,
                    sizeof(int)) < 0)
                        syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
+               break;
+       case AF_INET6:
+               if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &tos,
+                   sizeof(int)) < 0)
+                       syslog(LOG_WARNING, "setsockopt (IPV6_TCLASS): %m");
+               break;
        }
        /*
         * Turn off push flag to keep sender TCP from sending short packets

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to