Browse Source

Add crude congestion window debug trace

Allows us to compare our computed congestion window with the
underlying one used by the TCP layer.
tags/v1.8.90
Pierre Ossman 8 years ago
parent
commit
8cf7163ec0
3 changed files with 44 additions and 0 deletions
  1. 38
    0
      common/rfb/Congestion.cxx
  2. 5
    0
      common/rfb/Congestion.h
  3. 1
    0
      common/rfb/VNCSConnectionST.cxx

+ 38
- 0
common/rfb/Congestion.cxx View File

@@ -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 @@ int Congestion::getUncongestedETA()
}
}

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;

+ 5
- 0
common/rfb/Congestion.h View File

@@ -47,6 +47,11 @@ namespace rfb {
// 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();

+ 1
- 0
common/rfb/VNCSConnectionST.cxx View File

@@ -764,6 +764,7 @@ bool VNCSConnectionST::isCongested()

// Stuff still waiting in the send buffer?
sock->outStream().flush();
congestion.debugTrace("congestion-trace.csv", sock->getFd());
if (sock->outStream().bufferUsage() > 0)
return true;


Loading…
Cancel
Save