Add crude congestion window debug trace
Allows us to compare our computed congestion window with the
underlying one used by the TCP layer.
diff --git a/common/rfb/Congestion.cxx b/common/rfb/Congestion.cxx
index c7d6f71..a2f7a25 100644
--- a/common/rfb/Congestion.cxx
+++ b/common/rfb/Congestion.cxx
@@ -36,6 +36,14 @@
#include <assert.h>
#include <sys/time.h>
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <linux/sockios.h>
+#endif
+
#include <rfb/Congestion.h>
#include <rfb/LogWriter.h>
#include <rfb/util.h>
@@ -43,6 +51,9 @@
// Debug output on what the congestion control is up to
#undef CONGESTION_DEBUG
+// Dump socket congestion window debug trace to disk
+#undef CONGESTION_TRACE
+
using namespace rfb;
// This window should get us going fairly fast on a decent bandwidth network.
@@ -273,6 +284,33 @@
}
}
+void Congestion::debugTrace(const char* filename, int fd)
+{
+#ifdef CONGESTION_TRACE
+#ifdef __linux__
+ FILE *f;
+ f = fopen(filename, "ab");
+ if (f != NULL) {
+ struct tcp_info info;
+ int buffered;
+ socklen_t len;
+ len = sizeof(info);
+ if ((getsockopt(fd, IPPROTO_TCP,
+ TCP_INFO, &info, &len) == 0) &&
+ (ioctl(fd, SIOCOUTQ, &buffered) == 0)) {
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ fprintf(f, "%u.%06u,%u,%u,%u,%u\n",
+ (unsigned)now.tv_sec, (unsigned)now.tv_usec,
+ congWindow, info.tcpi_snd_cwnd * info.tcpi_snd_mss,
+ getInFlight(), buffered);
+ }
+ fclose(f);
+ }
+#endif
+#endif
+}
+
unsigned Congestion::getExtraBuffer()
{
unsigned elapsed;
diff --git a/common/rfb/Congestion.h b/common/rfb/Congestion.h
index 5feea65..fd57c22 100644
--- a/common/rfb/Congestion.h
+++ b/common/rfb/Congestion.h
@@ -47,6 +47,11 @@
// longer be congested.
int getUncongestedETA();
+ // debugTrace() writes the current congestion window, as well as the
+ // congestion window of the underlying TCP layer, to the specified
+ // file
+ void debugTrace(const char* filename, int fd);
+
protected:
unsigned getExtraBuffer();
unsigned getInFlight();
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index b2ceb7d..5b9152c 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -764,6 +764,7 @@
// Stuff still waiting in the send buffer?
sock->outStream().flush();
+ congestion.debugTrace("congestion-trace.csv", sock->getFd());
if (sock->outStream().bufferUsage() > 0)
return true;