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);
pgp783a4FjtVH.pgp
Description: PGP signature
