This small patch adds support for Type of Service support of the same
sort that the original command-line FTP has had for years, designating
FTP data streams as MAXIMIZE_THROUGHPUT and FTP control streams as
MINIMIZE_LATENCY.

Linux's (default queuing discipline, on kernels with Advanced Router
built in) prio_fast queuing discipline takes advantage of this data.
Having packets have ToS allows users to configure home broadband
routers and the like to do traffic shaping over a saturated
connection.

Thanks for lftp -- it's a nice little package that I use regularly,
with support for connecting to everything.  :-)
? autom4te.cache
? contrib/Makefile
? contrib/Makefile.in
? m4/codeset.m4
? m4/gettext.m4
? m4/glibc21.m4
? m4/iconv.m4
? m4/intdiv0.m4
? m4/intmax.m4
? m4/inttypes-pri.m4
? m4/inttypes.m4
? m4/isc-posix.m4
? m4/lcmessage.m4
? m4/lib-ld.m4
? m4/lib-link.m4
? m4/lib-prefix.m4
? m4/longdouble.m4
? m4/longlong.m4
? m4/nls.m4
? m4/po.m4
? m4/printf-posix.m4
? m4/progtest.m4
? m4/signed.m4
? m4/size_max.m4
? m4/stdint_h.m4
? m4/wchar_t.m4
? m4/wint_t.m4
? m4/xsize.m4
? po/stamp-po
? readline-4.3/Makefile
Index: src/NetAccess.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/NetAccess.cc,v
retrieving revision 1.74
diff -u -r1.74 NetAccess.cc
--- src/NetAccess.cc    1 Dec 2004 12:17:43 -0000       1.74
+++ src/NetAccess.cc    1 Mar 2005 00:38:47 -0000
@@ -27,6 +27,7 @@
 #include <math.h>
 #include <sys/types.h>
 #include <netinet/in.h>
+#include <netinet/ip.h>
 #ifdef HAVE_NETINET_TCP_H
 # include <netinet/tcp.h>
 #endif
@@ -137,6 +138,22 @@
 {
    setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,(char*)&one,sizeof(one));
 }
+void NetAccess::MinimizeLatency(int sock)
+{
+   int tos;
+#ifdef IP_TOS
+   tos = IPTOS_LOWDELAY;
+   setsockopt(sock, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int));
+#endif
+}
+void NetAccess::MaximizeThroughput(int sock)
+{
+   int tos;
+#ifdef IP_TOS
+   tos = IPTOS_THROUGHPUT;
+   setsockopt(sock, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int));
+#endif
+}
 void NetAccess::ReuseAddress(int sock)
 {
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&one,sizeof(one));
Index: src/NetAccess.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/NetAccess.h,v
retrieving revision 1.35
diff -u -r1.35 NetAccess.h
--- src/NetAccess.h     14 Oct 2004 12:02:36 -0000      1.35
+++ src/NetAccess.h     1 Mar 2005 00:38:47 -0000
@@ -64,6 +64,8 @@
    void         SetSocketMaxseg(int sock);
 
    static void KeepAlive(int sock);
+   static void MinimizeLatency(int sock);
+   static void MaximizeThroughput(int sock);
    static void ReuseAddress(int sock);
    static void SetSocketBuffer(int sock,int val);
    static void SetSocketMaxseg(int sock,int val);
Index: src/ftpclass.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/ftpclass.cc,v
retrieving revision 1.348
diff -u -r1.348 ftpclass.cc
--- src/ftpclass.cc     10 Feb 2005 13:37:18 -0000      1.348
+++ src/ftpclass.cc     1 Mar 2005 00:38:51 -0000
@@ -1247,6 +1247,7 @@
         return MOVED;
       }
       KeepAlive(conn->control_sock);
+         MinimizeLatency(conn->control_sock);
       SetSocketBuffer(conn->control_sock);
       SetSocketMaxseg(conn->control_sock);
       NonBlock(conn->control_sock);
@@ -1599,6 +1600,7 @@
         NonBlock(conn->data_sock);
         CloseOnExec(conn->data_sock);
         KeepAlive(conn->data_sock);
+        MaximizeThroughput(conn->data_sock);
         SetSocketBuffer(conn->data_sock);
         SetSocketMaxseg(conn->data_sock);
 
@@ -2021,6 +2023,7 @@
       NonBlock(conn->data_sock);
       CloseOnExec(conn->data_sock);
       KeepAlive(conn->data_sock);
+         MaximizeThroughput(conn->data_sock);
       SetSocketBuffer(conn->data_sock);
       SetSocketMaxseg(conn->data_sock);
 

Attachment: pgp783a4FjtVH.pgp
Description: PGP signature

Reply via email to